Ich habe Java-Code, der eine UTF-8-Zeichenfolge auf die Größe meiner Oracle-Spalte (11.2.0.4.0) zuschneidet, was zu einem Fehler führt, da Java und Oracle die Zeichenfolge als unterschiedliche Bytelängen betrachten. Ich habe überprüft NLS_CHARACTERSET
, ob mein Parameter in Oracle 'UTF8' ist.
Ich habe einen Test geschrieben, der mein Problem unten mit dem Unicode-Chipmunk-Emoji (🐿️) veranschaulicht.
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();
}
Dies schlägt in der letzten Zeile des Tests mit der folgenden Meldung fehl:
ORA-12899: Wert zu groß für Spalte
"MYSCHEMA". "TEMP". "FOO" (aktuell: 9, maximal: 7)
Die Einstellung von NLS_LENGTH_SEMANTICS
ist BYTE
. Leider kann ich dies nicht ändern, da es sich um ein Legacy-System handelt. Ich bin nicht daran interessiert, die Spaltengröße zu erhöhen, sondern nur die Oracle-Größe einer Zeichenfolge zuverlässig vorhersagen zu können.