Вставка национальных символов в колонку NCHAR или NVARCHAR оракула не работает - PullRequest
6 голосов
/ 28 июня 2011

При вставке строк в базу данных оракула некоторые национальные символы заменяются знаками вопроса, даже если они вставляются в столбец NCHAR или NVARCHAR, что должно обрабатывать все символы Юникода.

Это происходитиспользуя Oracle Developer SQL, sqlplus или драйвер JDBC.

База данных NLS_CHARACTERSET установлена ​​в WE8ISO8859P1 (западноевропейский iso-8859-1). NLS_NCHAR_CHARACTERSET, используемый для столбцов NCHAR, устанавливается в AL16UTF16.(UTF-16)

Кажется, что любой символ, отсутствующий в NLS_CHARACTERSET, заменен на перевернутый знак вопроса.

Ответы [ 2 ]

20 голосов
/ 28 июня 2011

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
0 голосов
/ 28 ноября 2017

Спасибо, КарлП - это помогло мне.Возвращаясь к тому, что сработало для меня.

Вставка китайского (любого utf8) текста в столбец nvarchar базы данных, не поддерживающей Юникод (например, ISO8859 и т. Д.), С использованием sqlplus в linux.

Эти параметры БДв моей системе обратите внимание на однобайтовую кодировку для символа, но многобайтовую для nchare.NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET AL16UTF16

Например:

INSERT INTO tt values ( N'气前照灯' );

Важно указать «N» перед строкой.Также необходимо установить env перед запуском sqlplus,

# Important to tell sqldeveloper what encoding is needed.
export NLS_LANG=AMERICAN_AMERICA.UTF8
# Others might find AMERICAN_AMERICA.AL32UTF8 or whatever better suits.

# ** THIS MATTERS - DOES NOT WORK WITHOUT !! 
export ORA_NCHAR_LITERAL_REPLACE=true
...