Данная статья посвящена вопросам с кодировкой при работе с
БД 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.
На этом всё!