Вставка национальных символов в столбец 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