Очередная статья на эту тему, но с некоторыми уточнениями.
Имеем:
Windows 7 x64
СУБД Oracle Database XE
ODBC-драйвер для работы с Oracle Database
Стороннее ПО, использующее ODBC-подключение к БД
Проблема:
Знаки вопроса при отображении кириллицы в клиентском ПО, а также иероглифы при отображении кириллицы в SQLPlus.
Как оказалось:
В системе должна быть правильно установлена переменная NLS_LANG, отвечающая за языковые настройки. Формат описания параметра NLS_LANG:
<Язык>_<Территория>.<Кодировка>
, где:
<Язык>
– AMERICAN/RUSSIAN и др.<Территория>
– AMERICA/RUSSIA/CIS и др.<Кодировка>
– CL8MSWIN1251/CL8KOI8R/RU8PC866/AL32UTF8/UTF8 и др.
ПРИМЕЧАНИЕ: Непосредственно на кодирование символов влияет только <кодировка>, указанная после точки.
При каждом клиентском соединении с БД Oracle задаются и потом используются параметры сессии (таблица NLS_SESSION_PARAMETERS). Проверить их значение для текущей сессии можно запросом:
1 |
SQLPLUS> SELECT * FROM NLS_SESSION_PARAMETERS; |
Для утилиты SQLPlus можно задать нужные языковые настройки несколькими способами (в порядке уменьшения приоритетности):
1) Выполнить ALTER SESSION в самом клиентском приложении, например:
1 |
SQLPLUS> ALTER SESSION SET NLS_LANGUAGE= 'RUSSIAN'; |
2) Установить NLS_LANG в текущем терминальном сеансе cmd или bat-файле.
Получить:
1 2 |
> set NLS_LANG NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251 |
Установить:
1 |
> SET NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251 |
3) Установить NLS_LANG в переменной окружения системы:
Свойства системы => Переменные среды => Создать переменную среды пользователя
4) Установить NLS_LANG в ключе ветки реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\oracle\KEY_XEНо при этом, если мы установим кодировку в NLS_LANG в CL8MSWIN1251, то в консоли тоже нужно установить аналогичную кодовую страницу, а также шрифт Lucida Console (ПКМ на заголовке окна консоли => Свойства => Шрифт), иначе останутся кракозябры.
Кодовая страница в текущей терминальной сессии
Получить:
1 2 |
> chcp Текущая кодовая страница: 866 |
Установить:
Клиентское ПО, например, программа ViewODBC или PL SQL Developer, берет NLS_LANG ТОЛЬКО из переменных окружения, а не из реестра. По крайней мере, не только у меня вышло так.
ПРИМЕЧАНИЕ 2: Не забывайте перезапустить клиентскую программу после установки переменной окружения.
Вот тут еще есть интересные эксперименты с вариациями значений параметров CHARACTERSET, NLS_LANG и LANG (на Linux) и других.
Было давольно интересно, спасибо!
ничего не работет!!1111111
Спасибо.
Спасибо, ваш сайт очень полезный!