J'ai du code java qui coupe une chaîne UTF-8 à la taille de ma colonne Oracle (11.2.0.4.0), ce qui finit par générer une erreur car java et Oracle voient la chaîne comme des longueurs d'octets différentes. J'ai vérifié que mon NLS_CHARACTERSET
paramètre dans Oracle est 'UTF8'.
J'ai écrit un test qui illustre mon problème ci-dessous en utilisant les 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();
}
Cela échoue sur la dernière ligne du test avec le message suivant:
ORA-12899: valeur trop grande pour la colonne
"MYSCHEMA". "TEMP". "FOO" (réel: 9, maximum: 7)
Le réglage de NLS_LENGTH_SEMANTICS
est BYTE
. Malheureusement, je ne peux pas changer cela car c'est un système hérité. Je ne suis pas intéressé à augmenter la taille de la colonne, mais à pouvoir prédire de manière fiable la taille Oracle d'une chaîne.