Tôi có mã java cắt xén một chuỗi UTF-8 theo kích thước của cột Oracle (11.2.0.4.0) của tôi, kết quả là gây ra lỗi vì java và Oracle xem chuỗi này có độ dài byte khác nhau. Tôi đã xác minh NLS_CHARACTERSET
tham số của mình trong Oracle là 'UTF8'.
Tôi đã viết một bài kiểm tra minh họa vấn đề của mình dưới đây bằng biểu tượng cảm xúc chipmunk 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();
}
Điều này không thành công ở dòng cuối cùng của bài kiểm tra với thông báo sau:
ORA-12899: giá trị quá lớn đối với cột
"MYSCHema". "TEMP". "FOO" (thực tế: 9, tối đa: 7)
Các thiết lập NLS_LENGTH_SEMANTICS
là BYTE
. Thật không may, tôi không thể thay đổi điều này vì nó là một hệ thống cũ. Tôi không quan tâm đến việc tăng kích thước cột, đáng tin cậy là có thể dự đoán kích thước Oracle của một chuỗi.