Saya memiliki kode java pemangkasan string UTF-8 dengan ukuran kolom Oracle (11.2.0.4.0) saya yang akhirnya menimbulkan kesalahan karena java dan Oracle melihat string sebagai panjang byte yang berbeda. Saya telah memverifikasi NLS_CHARACTERSET
parameter saya di Oracle adalah 'UTF8'.
Saya menulis tes yang menggambarkan masalah saya di bawah ini menggunakan emoji unicode chipmunk (🐿️)
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();
}
Ini gagal pada baris terakhir tes dengan pesan berikut:
ORA-12899: nilai terlalu besar untuk kolom
"MYSCHEMA". "TEMP". "FOO" (aktual: 9, maksimum: 7)
Pengaturan NLS_LENGTH_SEMANTICS
adalah BYTE
. Sayangnya, saya tidak dapat mengubah ini karena ini adalah sistem warisan. Saya tidak tertarik untuk meningkatkan ukuran kolom, hanya dapat dipercaya mampu memprediksi ukuran string Oracle.