我们正在尝试将UTF-16编码的字符串存储到AL32UTF8 Oracle数据库中.
我们的程序完全适用于使用WE8MSWIN1252作为字符集的数据库.当我们尝试在使用AL32UTF8的数据库上运行它时,它会转到java.sql.SQLException:ORA-01461:只能绑定LONG值才能插入LONG列.
在下面的测试用例中,只要我们的输入数据不会太长,一切正常.
输入字符串可以超过4000个字符.我们希望保留尽可能多的信息,即使我们意识到必须切断输入.
我们的数据库表使用CHAR关键字定义(见下文).我们希望这可以让我们存储多达4000个字符集.可以这样做吗?如果是这样,怎么样?
我们尝试使用ByteBuffer将String转换为UTF8但没有成功. 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个字符长,它仍然无法成功执行.
提前致谢!