Eu tenho código java aparando uma string UTF-8 para o tamanho da minha coluna Oracle (11.2.0.4.0) que acaba gerando um erro porque java e Oracle veem a string como comprimentos de bytes diferentes. Eu verifiquei que meu NLS_CHARACTERSET
parâmetro no Oracle é 'UTF8'.
Escrevi um teste que ilustra meu problema abaixo usando o emoji de esquilo 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();
}
Isso falha na última linha do teste com a seguinte mensagem:
ORA-12899: valor muito grande para a coluna
"MYSCHEMA". "TEMP". "FOO" (real: 9, máximo: 7)
A configuração de NLS_LENGTH_SEMANTICS
é BYTE
. Infelizmente, não posso mudar isso, pois é um sistema legado. Não estou interessado em aumentar o tamanho da coluna, apenas em poder prever com precisão o tamanho do Oracle de uma string.