我们正试图存储一个UTF-16编码字符串转换成AL32UTF8 Oracle数据库。
我们的计划完美的作品,使用的数据库上WE8MSWIN1252
的字符集。 当我们试图使用一个数据库上运行它AL32UTF8
它得到一个java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column
。
在下面的一切测试用例只要我们输入数据并没有得到太长时间正常工作。
输入字符串可以超过4000个字符。 我们希望保留尽可能多的信息越好,尽管我们实现了输入将被切断。
我们的数据库表使用定义的CHAR
关键字(见下文)。 我们希望,这将使我们能够存储多达任何字符集的字符4000。 可以这样做? 如果是这样,怎么样?
我们已经尝试了字符串转换为UTF8
使用一个ByteBuffer
没有成功。 OraclePreparedStatement.setFormOfUse(...)
也没有帮助我们。
切换到CLOB
是不是一种选择。 如果字符串太长,需要切除。
这是我们现在的代码:
public static void main(String[] args) throws Exception {
String ip ="193.53.40.229";
int port = 1521;
String sid = "ora11";
String username = "obasi";
String password = "********";
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@" + ip + ":" + port + ":" + sid;
Class.forName(driver);
String shortData = "";
String longData = "";
String data;
for (int i = 0; i < 5; i++)
shortData += "é";
for (int i = 0; i < 4000; i++)
longData += "é";
Connection conn = DriverManager.getConnection(url, username, password);
PreparedStatement stat = null;
try {
stat = conn.prepareStatement("insert into test_table_short values (?)");
data = shortData.substring(0, Math.min(5, shortData.length()));
stat.setString(1, data);
stat.execute();
stat = conn.prepareStatement("insert into test_table_long values (?)");
data = longData.substring(0, Math.min(4000, longData.length()));
stat.setString(1, data);
stat.execute();
} finally {
try {
stat.close();
} catch (Exception ex){}
}
}
这是简单的表的创建脚本:
CREATE TABLE test_table_short (
DATA VARCHAR2(5 CHAR);
);
CREATE TABLE test_table_long (
DATA VARCHAR2(4000 CHAR);
);
测试用例完美的作品在短数据。 在长期的数据但是它一直得到错误。 即使我们longData
只有3000个字符长,它仍然无法成功执行。
提前致谢!