Edit: обратите внимание, что лучший способ обработки UTF в Oracle - это создание базы данных с использованием набора символов базы данных AL32UTF8 и использование обычных столбцов varchar2. Одна из проблем с использованием столбцов nchar заключается в том, что oracle не может использовать индексы для обычных столбцов char / varchar2, когда аргументы отправляются как nchar по умолчанию.
В любом случае: если вы не можете преобразовать базу данных:
Во-первых, к литералам Юникода необходимо добавить префикс 'n', например:
select n'Language - Språk - Język' from dual;
*) 8-битные кодировки не могут обработать этот текст
К сожалению, этого недостаточно.
По какой-то причине стандартное поведение клиентов базы данных заключается в переводе всех строковых литералов в набор символов базы данных,
Это означает, что значения будут изменены еще до того, как база данных увидит строку.
Клиентам нужна некоторая конфигурация, чтобы можно было вставлять символ Unicode в столбец NCHAR или NVARCHAR:
SQL Plus в Unix
Эти переменные environemnet настраивают среду unix и sqlplus для использования файлов UTF-8,
а также настроить sqlplus для отправки строковых литералов в юникоде.
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LC_CTYPE="en_US.UTF-8"
ORA_NCHAR_LITERAL_REPLACE=true
(en_US.UTF-8 для Solaris - Linux или другим системам могут потребоваться разные строки, используйте locale -a
для просмотра списка поддерживаемых локалей.)
Драйвер JDBC
Приложения, использующие драйвер JDBC Oracles, должны иметь следующее системное свойство, определенное для отправки строковых литералов в Unicode.
-Doracle.jdbc.defaultNChar=true
-Doracle.jdbc.convertNcharLiterals=true
SQL Developer
Найдите файл sqldeveloper.conf и добавьте следующие строки:
AddVMOption -Doracle.jdbc.defaultNChar=true
AddVMOption -Doracle.jdbc.convertNcharLiterals=true
SQL Plus в Microsoft Windows
Я не пробовал, если SQLplus в Microsoft Windows или Toad вообще обрабатывает utf-8.
Sqlplusw.exe может сделать это, и следующие настройки реестра могут помочь.
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORA_NCHAR_LITERAL_REPLACE=true