Данная статья посвящена вопросам с кодировкой при работе с БД Oracle через SAS на среде UNIX.
Сколько «собак уже было съедено» с вопросами кодировки, но, тем не менее, они периодически всплывают. Например, отображение вопросительных знаков вместо русских букв, является распространённой проблемой.
Попробуем разобраться ниже.
В первую очередь перед настройкой кодировки я настоятельно рекомендую прочитать пару документов:
Далее, необходимо убедиться, что на сервере UNIX, где установлен SAS, установлен клиент Oracle. Сделать это можно, запустив следующую командную строку через Putty:
echo $ORACLE_HOME
Если данный параметры возвращает пустую строку, то скорее всего клиент Oracle отсутствует.
Даже если клиент установлен, скорее всего, придётся проверить следующие параметры: PATH и LD_LIBRARY_PATH. Запускаем командную строку:
echo $PATH
В строке PATH ищем что-то вроде /../oracle/client64/bin
Если такой строки нет, то необходимо выполнить следующую команду:
export PATH=$PATH:/../oracle/../bin
Аналогично проверяем второй параметр, запустив следующую команду:
echo $LD_LIBRARY_PATH
Если такой параметр отсутствует, то необходимо выполнить следующую команду
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
Следующим шагом будет установка (или мы убедимся, что они установлены) необходимых библиотек для корректной работы SAS в системе UNIX. Для этого, запустим следующую командную строку на сервере SAS:
yum install libXp glibc libXp-devel
Как показала практика, такие вещи забывают делать, а потом сложно разобраться, откуда появляются проблемы. Без данных библиотек практически невозможно разобраться с ошибками, которые появляются в логах, так как они сообщают о том, что с данной ошибкой необходимо обратиться в техническую поддержку SAS.
Далее, необходимо выявить в какой кодировке была развернута БД Oracle. Запустим следующую строку, например, вSQL Developer:
select * from nls_database_parameters
В качестве результаты мы получим список параметров, и нас интересуют следующие:
NLS_LANGUAGE
|
AMERICAN
|
NLS_TERRITORY
|
AMERICA
|
NLS_NCHAR_CHARACTERSET
|
AL16UTF16
|
Во втором столбце настойки использованы в качестве примера.
Далее, смотрим на конфигурационную настройку сессий SAS. Для этого в SAS Base, SAS Enterprise Guide или другой среде, где можно запустить SAS код, запускаем следующую строку:
Proc options
option=config
option=locale
option=encoding;
Run;
В качестве результата, может получиться что-то вроде:
CONFIG=(
/SAS94/SASHome/SASFoundation/9.4/sasv9.cfg
/SAS94/SASHome/SASFoundation/9.4/nls/u8/sasv9.cfg
/SAS94/SASHome/SASFoundation/9.4/sasv9_local.cfg
/SAS94/sasconfig/Lev1/SASApp/sasv9.cfg
/SAS94/sasconfig/Lev1/SASApp/sasv9_usermods.cfg
/SAS94/sasconfig/Lev1/SASApp/WorkspaceServer/sasv9.cfg
/SAS94/sasconfig/Lev1/SASApp/WorkspaceServer/sasv9_usermods.cfg )
LOCALE=EN_US Specifies the current locale for the SAS session
ENCODING=UTF-8 Specifies default encoding for internal processing of data
Таким образом, мы видим настройки как среды SAS, так и Oracle.
В принципе, данные настройки являются корректными, тем не менее проблема с отображением кириллицы может оставаться.
В данном вопросе приходит на помощь параметр NLS_LANG. Попробуем запустить командную строку в UNIX:
echo $NLS_LANG
Данный параметр может оказаться вовсе пустым.
Для кодировки AL16UTF16 я рекомендую запустить следующую командную строку:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
Для того чтобы настройки вступили в силу, необходимо перезагрузить SAS ObjectSpawner на сервере SAS. Для этого запускаем командную строку:
/../sasconfig/Lev1/ObjectSpawner/ObjectSpawner.sh restart
Если же, необходимо отобразить кодировку CYRILLIC, то для этого необходимо запустить строку с другим параметром:
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
Но этого будет не достаточно. Также потребуется добавить следующий параметр в файл:
/../sasconfig/Lev1/SASApp/WorkspaceServer/sasv9_usermods.cfg
-ENCODING=WCYRILLIC
Далее перезагружаем SAS ObjectSpawner.
Но в случае перезагрузки сервера, или всех служб SAS, всё придётся выставлять заново. Для того, чтобы этого избежать добавим все необходимые параметры в файл /home/user/.bash_profile:
export PATH=$PATH:/../oracle/../bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
Вместо пользователя user необходимо подставить имя пользователя, из-под которого запускаются процессы SAS.
На этом всё!
Спасибо огромнейшее, Сергей! Этой статьей Вы решили проблему, над которой я безуспешно бился две недели! Очень своевременно 🙂
Кстати способов настройки подобных переменных полно. Например чтобы в библиотеках oracle в таблицах, где есть русский текст отображались не знаки «?», то достаточно поместить в файл:
$SASROOT:/SASConfig/Lev1/level_env_usermods.sh
Следующие строки:
export LANG=ru_RU
export NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251
export NLS_SORT=BINARY
и сюда:
$SASROOT:/SASConfig/Lev1/SASApp/WorkspaceServer/sasv9_usermods.cfg
-ENCODING=WCYRILLIC
Плюс данного способа в том, что не нужно на ОС уровне системы в баш профайлах юзера прописывать експорты переменных окружения. Кстати и без NLS_LANG отображаются данные ровно.