Oracle, UTF-8, NVARCHAR2 и много путаницы - PullRequest
6 голосов
/ 07 июня 2011

У меня есть следующая таблица «перевода» в базе данных Oracle 10g:

ID  VARCHAR2(100 BYTE)
LANGUAGE    CHAR(2 BYTE)
COUNTRY CHAR(2 BYTE)
TRANSLATION NVARCHAR2(2000 CHAR)
TRACK_TIMESTAMP DATE
TRACK_USER  VARCHAR2(2000 BYTE)

Когда я пытаюсь сделать это:

update translation set translation = 'œ' where id = 'MY_ID' And language = 'fr';

Затем я запускаю это:

select * from translation where id = 'MY_ID' and language = 'fr';

и в столбце перевода показано: S вместо œ, и я понятия не имею, почему.

Из-за существующих проблем я не могу преобразовать всю базу данных в UTF-8, есть ли другие варианты?

В настоящее время национальный набор символов - AL16UTF16. Обычный набор символов WE8ISO8859P1.

Я сейчас использую Java 1.6

Выше приведен упрощенный пример. Вот как выглядит запрос в моем реальном приложении:

UPDATE TRANSLATION SET TRANSLATION=? WHERE TRANSLATION.COUNTRY=? and TRANSLATION.ID=? and TRANSLATION.LANGUAGE=? 1=1,800 - 2,500 œufs par heure 2=CA 3=3_XT_FE_ECS18 4=fr

Проблема в том, что вместо добавления œufs добавляется ¿ufs

1 Ответ

1 голос
/ 07 июня 2011

Поскольку вы используете переменные связывания, а не жестко запрограммированные литералы, вы должны иметь возможность передавать строки Unicode в оператор UPDATE.

Если вы использовали прямую JDBC для записи в базу данных, в Руководстве разработчика JDBC есть пример записи данных в столбец NVARCHAR2 .Если вы используете 1.5 JVM, необходимо использовать вызов OraclePreparedStatement.setFormOfUse для каждого столбца NVARCHAR2.В 1.6 JVM жизнь становится проще, потому что в JDBC 4.0 добавлены типы NCHAR и NVARCHAR2.Если вы используете 1.5 JVM, получение среды ORM, такой как Spring, для использования расширений Oracle для JDBC может быть нетривиальным мероприятием.Я недостаточно знаком со Spring, чтобы знать, какие шаги необходимы для этого.

Потенциально вы можете изменить строку подключения, указав defaultNChar = true.Это заставит драйвер обрабатывать все столбцы символов, используя национальный набор символов.Этого может быть достаточно, чтобы решить вашу проблему, не заставляя Spring использовать расширения OraclePreparedStatement.

...