У меня есть Java-код, обрезающий строку UTF-8 до размера моего столбца Oracle (11.2.0.4.0), который в итоге выдает ошибку, потому что Java и Oracle видят строку как разные длины байтов. Я подтвердил, что мой NLS_CHARACTERSET
параметр в Oracle - «UTF8».
Я написал тест, который иллюстрирует мою проблему ниже, используя эмодзи бурундук 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();
}
Это завершается с ошибкой в последней строке теста со следующим сообщением:
ORA-12899: слишком большое значение для столбца
"MYSCHEMA". "TEMP". "FOO" (фактическое: 9, максимальное: 7)
Настройка NLS_LENGTH_SEMANTICS
есть BYTE
. К сожалению, я не могу изменить это, поскольку это устаревшая система. Я не заинтересован в увеличении размера столбца, просто могу надежно предсказать размер строки Oracle в Oracle.