Вставка национальных символов в столбец oracle NCHAR или NVARCHAR не работает

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

это происходит с помощью разработчика SQL Oracle, sqlplus или с помощью драйвера JDBC.

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

любой символ, не входящий в NLS_CHARACTERSET, по-видимому, заменяется перевернутым вопросительным знаком.

2 ответов


Edit: обратите внимание, что лучший способ обработки 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

(язык.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

спасибо KarlP-это заставило меня идти. Повторяю, что сработало для меня.

вставка китайского ( любого utf8 ) текста в столбец nvarchar базы данных без Юникода (например: ISO8859 и т. д. ), Используя sqlplus в linux.

эти параметры БД в моей системе, обратите внимание на однобайтовую кодировку для char, но многобайтовую для nchare. NLS_CHARACTERSET WE8ISO8859P1
ИСПОЛЬЗОВАНИЕМ AL16UTF16 NLS_NCHAR_CHARACTERSET

например:

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