Настраиваем NLS_LANG для PLSQL Developer

Написано 19 Декабрь, 2014 в категории Oracle,Разработка ПО


Симптомы: есть таблица, в таблице добавлены записи с кириллицей (не через PLSQL Developer). При запросе этих записей - кириллица отображается корректно. Но если кириллицу вставим мы из своего PLSQL Developer то при запросе этих записей получим вместо кириллицы - знаки вопроса. Это верный признак того что, что-то не так с переменной NLS_LANG.

Для диагностики проблемы необходимо включить проверку кодировки в PLSQL Developer

Картинка 1.


Картинка 2.

Пытаемся подключиться к базе...
У меня появилось такое вот полезное предупреждение:

Картинка 3.

Тут необходимо рассказать предысторию. Когда я столкнулся с, описанной в начале поста, проблемой, то решил сразу погуглить. А нагуглилось там в принципе правильное решение установить корректное значение NLS_LANG, однако найти алгоритм такой "корректной" настройки мне так и не удалось. Далее, 9 из 10 статей предлагали сделать изменение в реестре в ветке
\HKEY_LOCAL_MACHINE\Software\ORACLE, некоторые авторы шли дальше и предлагали изменить еще и все NLS_LANG во вложенных ветках. Возможно эти советы кому-то и помогли, но я перепробовав все эти советы получил нулевой результат.

Тут я и нашел настройку plsql developer, которая включает проверку соответствия кодировок клиента и сервера (Картинки 1 и 2). При подключении к серверу я получил предупреждение (Картинка 3), которое оказалось, мягко говоря, неожиданным. plsql developer утверждал что пытается читать NLS_LANG из не существующей ветки. Т.к. regedit у меня уже был открыт, то я просто добавил новую ветку и NLS_LANG, перезагрузил plsql developer и... получил все тоже предупреждение. Я не стану утверждать что этот вариант не рабочий и его пробовать не стоит, но у меня решение с реестром не взлетело почему-то.

Оставалось добавить NLS_LANG в виде переменной окружения. После перезапуска plsql developer все заработало как надо.

Картинка 4.

Для справки:
Чтобы посмотреть текущую кодировку БД надо выполнить в plsql developer в меню File->New->SQL Window команду
SELECT * FROM NLS_DATABASE_PARAMETERS;

Кодировка клиента:
SELECT * FROM NLS_SESSION_PARAMETERS;

Синтаксис NLS_LANG переменной:
<Язык>_<Территория>.<Кодировка>
где
<Язык> - язык сообщений
<Территория> - NLS параметры - представление дат, разделителей и т.п. по умолчанию
и СОРТИРОВКА ! Но можно задать отдельно NLS_SORT
<Кодировка> - CHARACTERSET в котором работает клиент и желает видеть и вводить данные