oracle4000限制,java – Oracle JDBC charset和4000 char限制

我们正在尝试将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个字符长,它仍然无法成功执行.

提前致谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值