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

У меня есть быстрый вопрос, я хотел бы узнать 9X_us-ascii разницу между Настройка NLS_NCHAR_CHARACTERSET 9X_character-encoding и NLS_CHARACTERSET в Oracle ??

насколько 9X_us-ascii я понимаю, NLS_NCHAR_CHARACTERSET предназначен 9X_oracle для типов данных NVARCHAR и для NLS_CHARACTERSET 9X_varchar2 будет для типов данных VARCHAR2.

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

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

Затем 9X_varchar2 я вставил в базу данных несколько значений 9X_us-ascii китайских иероглифов. Я вставил символы 9X_varchar2 в таблицу с именем data_ и обновил столбцы 9X_ascii для ADDRESS и ADDRESS_2, которые являются 9X_us-ascii столбцами VARCHAR2. Насколько я понимаю 9X_charset-table с текущими настройками для NLS_CHARACTERSET 9X_charset-table US7ASCII, китайские символы не должны поддерживаться, но 9X_oracle они все еще отображаются в базе данных ?? имеет 9X_us-ascii ли NLS_NCHAR_CHARACTERSET приоритет над 9X_varchar2 этим ??

Спасибо.

11
1

  • Не копируйте скриншоты. Скопируйте / вставьте текст из SQL Plus и отформати ...
1
Общее количество ответов: 1

Ответ #1

Ответ на вопрос: Разница между NLS_NCHAR_CHARACTERSET и NLS_CHARACTERSET для Oracle

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

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

Причина в 9X_character-encoding том, что набор символов вашей базы данных 9X_utf и набор символов вашего клиента (т.е. см. значение 9X_oracle NLS_LANG) оба являются US7ASCII. В вашей базе данных используется 9X_ascii US7ASCII, и она «думает» также, что клиент отправляет 9X_character-encoding данные с помощью US7ASCII. Таким образом, он не 9X_charset-table выполняет никакого преобразования строк, данные 9X_us-ascii передаются побитно от клиента к серверу 9X_charset-table и наоборот.

В связи с этим вы можете использовать 9X_character-encoding символы, которые на самом деле не поддерживаются 9X_character-encoding US7ASCII. Имейте в виду, что если ваш клиент использует 9X_varchar2 другой набор символов (например, когда вы 9X_us-ascii используете управляемый драйвер ODP.NET 9X_character-encoding в приложении Windows), данные будут бесполезными! Также, если 9X_character-encoding вы рассмотрите возможность миграции набора 9X_utf символов базы данных, у вас возникнет такая 9X_charset-table же проблема.

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

Если вы хотите 9X_character-encoding установить все правильно, вы можете либо 9X_utf установить переменную среды NLS_LANG=.ZHT16MSWIN950 (CP936, похоже, не 9X_ascii поддерживается Oracle), либо изменить кодовую 9X_charset-table страницу перед запуском sqlplus.exe с помощью команды 9X_utf chcp 437. При таких правильных настройках вы не 9X_oracle увидите никаких китайских иероглифов, как 9X_character-encoding вы, вероятно, ожидали.

11
0