Редактиране:Обърнете внимание, че най-добрият начин за работа с UTF на Oracle е да създадете базата данни с помощта на набора от знаци на базата данни AL32UTF8 и да използвате обикновени колони varchar2. Един от проблемите с използването на колони nchar е, че Oracle не може да използва индекси за обикновени колони char/varchar2, когато аргументите се изпращат като nchar по подразбиране.
Както и да е:Ако не можете да конвертирате базата данни:
Първо, Unicode литералите трябва да бъдат с префикс 'n', като това:
select n'Language - Språk - Język' from dual;
*) 8-битовите кодировки не могат да се справят с този текст
За съжаление това не е достатъчно.
По някаква причина поведението по подразбиране за клиентите на базата данни е да превеждат всички низови литерали в набора от знаци на базата данни, което означава, че стойностите ще бъдат променени дори преди базата данни да види низа.
Клиентите се нуждаят от някаква конфигурация, за да могат да вмъкнат уникод символ в колона NCHAR или NVARCHAR:
SQL Plus на Unix
Тези променливи environemnet настройват unix средата и sqlplus да използват UTF-8 файлове и също така конфигурират sqlplus да изпраща низови литерали в unicode.
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 драйвер
Приложенията, използващи Oracles JDBC драйвер, трябва да имат следното системно свойство, дефинирано, за да изпращат низови литерали в unicode.
-Doracle.jdbc.defaultNChar=true
-Doracle.jdbc.convertNcharLiterals=true
Разработчик на SQL
Намерете 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