natalix83 31 окт 2011, 12:27
Проблема поддержки русского языка и ее решение
сли вы установили версию Oracle Database 10g Express Edition (Western European), то после установки базы у вас возникнет проблема с поддержкой русского языка: попытка ввода русскоязычных данных в таблицы будет происходить без ошибок, но символы будут отображаться как «?». Причину этого найти довольно просто при помощи запроса:
SELECT NAME, VALUE$, COMMENT$
FROM SYS.PROPS$
Данный запрос извлекает настройки базы, в том числе языковые настройки (параметр NLS_CHARACTERSET). В базе значение этого параметра — WE8MSWIN1252, при этом значение аналогичного параметра в реестре — CL8MSWIN1251. Однако существует «шаманский» (иначе такой метод назвать нельзя) прием, сводящийся к запуску скрипта при помощи SQL Plus (sqlplus.exe устанавливается на компьютер при установке OracleXE её можно найти поиском):
CONNECT SYS/пароль AS SYSDBA;
UPDATE SYS.PROPS$
SET VALUE$ = ‘CL8MSWIN1251’
WHERE NAME = ‘NLS_CHARACTERSET’;
COMMIT;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER DATABASE OPEN;
ALTER DATABASE XE CHARACTER SET CL8MSWIN1251;
ALTER DATABASE XE NATIONAL CHARACTER SET CL8MSWIN1251;
SHUTDOWN IMMEDIATE;
STARTUP;
Данный скрипт модифицирует значение NLS_CHARACTERSET в таблице PROPS$ (что само по себе является некорректным действием), после чего фиксирует произведенное изменение, останавливает базу в режиме IMMEDIATE и перезапускает ее с включением режима RESTRICTED SESSION (в указанном режиме с базой могут работать только пользователи с привилегией RESTRICTED SESSION; перевод базы в этот режим необходим для выполнения ALTER DATABASE CHARACTER SET). Затем производятся открытие базы данных и модификация ее кодовой страницы, а после чего база перезапускается. После выполнения данного скрипта проблема с поддержкой русского языка исчезает. Важно отметить, что такие манипуляции допустимы только сразу же после установки (пока в базе нет объектов пользователя и данных) и могут производиться лишь на учебной базе. При установке Oracle Database 10g Express Edition (Universal) подобная проблема не должна возникнуть, так как в этом случае база хранит данные в формате Unicode. Однако Unicode-база медленнее работает со строками, а для хранения текстовой информации требуется вдвое больший объем. Данные проблемы возникают исключительно с Oracle XE, так как его старшие братья содержат средства для генерации базы, позволяющие настроить кодировку базы данных при ее создании.