Настраиваем NLS_LANG для PLSQL Developer
Симптомы: есть таблица, в таблице добавлены записи с кириллицей (не через PLSQL Developer). При запросе этих записей - кириллица отображается корректно. Но если кириллицу вставим мы из своего PLSQL Developer то при запросе этих записей получим вместо кириллицы - знаки вопроса. Это верный признак того что, что-то не так с переменной NLS_LANG.
Для диагностики проблемы необходимо включить проверку кодировки в PLSQL Developer
Картинка 1.
Пытаемся подключиться к базе...
У меня появилось такое вот полезное предупреждение:
Картинка 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 в котором работает клиент и желает видеть и вводить данные