Ho un codice Java che taglia una stringa UTF-8 alla dimensione della mia colonna Oracle (11.2.0.4.0) che finisce per generare un errore perché Java e Oracle vedono la stringa come lunghezze di byte diverse. Ho verificato che il mio NLS_CHARACTERSET
parametro in Oracle è "UTF8".
Ho scritto un test che illustra il mio problema di seguito utilizzando l' emoji 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();
}
Questo non riesce sull'ultima riga del test con il seguente messaggio:
ORA-12899: valore troppo grande per la colonna
"MYSCHEMA". "TEMP". "FOO" (effettivo: 9, massimo: 7)
L'impostazione di NLS_LENGTH_SEMANTICS
è BYTE
. Sfortunatamente, non posso cambiarlo perché è un sistema legacy. Non mi interessa aumentare le dimensioni della colonna, potendo semplicemente prevedere la dimensione Oracle di una stringa.