разница между NLS_NCHAR_CHARACTERSET и NLS_CHARACTERSET для Oracle

У меня есть быстрый вопрос, который я хотел бы знать разницу между Настройка NLS_NCHAR_CHARACTERSET и NLS_CHARACTERSET в oracle ??

насколько я понимаю, NLS_NCHAR_CHARACTERSET для типов данных NVARCHAR и для NLS_CHARACTERSET будет для типов данных VARCHAR2.

Я попытался проверить это на своем сервере разработки, мои текущие настройки для CHARACTERSET следующие: -

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               US7ASCII

Затем я вставил некоторые значения китайских символов в базу данных. я вставил символы в таблицу с именем data_ и обновил столбцы для ADDRESS и ADDRESS_2, которые являются столбцами VARCHAR2. Насколько я понимаю с текущей настройкой NLS_CHARACTERSET US7ASCII, китайские символы не должны поддерживаться, но они все еще отображаются в базе данных NLS_NCHAR_CHARACTERSET имеет приоритет над этим ??

Спасибо.

7 голосов | спросил Steven Tang Ti Khoon 19 AMpTue, 19 Apr 2016 09:36:53 +030036Tuesday 2016, 09:36:53

1 ответ


0

В целом все ваши очки верны. NLS_NCHAR_CHARACTERSET определяет набор символов для NVARCHAR2, и др. и др. столбцы, тогда как NLS_CHARACTERSET используется для VARCHAR2.

  

Почему вы видите китайские иероглифы с US7ASCII?

Причина в том, что ваш набор символов базы данных и ваш клиентский набор символов (т. е. см. значение NLS_LANG) являются US7ASCII. Ваша база данных использует US7ASCII, и она «думает», что клиент также отправляет данные, используя US7ASCII. Таким образом, он не выполняет никакого преобразования строк, данные передаются один-к-одному с клиента на сервер и наоборот.

В связи с этим вы можете использовать символы, которые на самом деле не поддерживаются US7ASCII. Имейте в виду, что если ваш клиент использует другой набор символов (например, когда вы используете ODP.NET Managed Driver в приложении Windows), данные будут мусором! Кроме того, если вы рассмотрите возможность переноса набора символов базы данных, у вас возникнет та же проблема.

Еще одно примечание: я не думаю, что вы бы получили такое же поведение с другими наборами символов, например если ваша база данных и ваш клиент будут использовать WE8ISO8859P1, например. Также имейте в виду, что у вас действительно неправильная конфигурация. Ваша база данных использует набор символов US7ASCII, ваш NLS_LANG значение также равно US7ASCII (скорее всего, оно вообще не установлено, и Oracle по умолчанию имеет значение US7ASCII) но реальный набор символов SQL * Plus, соответственно ваш терминал cmd.exe, скорее всего, CP950 или CP936 .

Если вы хотите установить все правильно, вы можете установить переменную окружения NLS_LANG=.ZHT16MSWIN950 (CP936, похоже, не поддерживается Oracle) или перед запуском sqlplus.exe измените кодовую страницу с помощью команды chcp 437. При правильных настройках вы не увидите китайских символов, как вы, вероятно, ожидали.

ответил Wernfried Domscheit 19 AMpTue, 19 Apr 2016 11:14:57 +030014Tuesday 2016, 11:14:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132