我有Java代码将UTF-8字符串修整为我的Oracle(11.2.0.4.0)列的大小,由于Java和Oracle将字符串视为不同的字节长度,最终引发了错误。我已经验证我NLS_CHARACTERSET
在Oracle中的参数是“ UTF8”。
我编写了一个使用Unicode花栗鼠表情符号(🐿️)在下面说明我的问题的测试
public void test() throws UnsupportedEncodingException, SQLException {
String squirrel = "\uD83D\uDC3F\uFE0F";
int squirrelByteLength = squirrel.getBytes("UTF-8").length; //this is 7
Connection connection = dataSource.getConnection();
connection.prepareStatement("drop table temp").execute();
connection.prepareStatement("create table temp (foo varchar2(" + String.valueOf(squirrelByteLength) + "))").execute();
PreparedStatement statement = connection.prepareStatement("insert into temp (foo) values (?)");
statement.setString(1, squirrel);
statement.executeUpdate();
}
这在测试的最后一行失败,并显示以下消息:
ORA-12899:列
“ MYSCHEMA”。“ TEMP”。“ FOO”的值太大(实际:9,最大值:7)
的设置NLS_LENGTH_SEMANTICS
为BYTE
。不幸的是,我无法更改它,因为它是旧系统。我对增加列的大小不感兴趣,只是可靠地能够预测字符串的Oracle大小。