Oracle mechanics

09.06.2013

Отображение текста, сохранённого в разных кодировках в бд с однобайтной кодировкой, через db link из UTF бд

Filed under: NLS,Oracle — Игорь Усольцев @ 22:54
Tags: , ,

Непрямой способ для редких случаев когда нужно одновременно получить / отобразить данные, сохранённые в разных однобайтовых кодировках

Вставка в бд с однобайтной кодировкой:

$ export LANG=russian
$ export NLS_LANG=AMERICAN_CIS.CL8MSWIN1251
$ sqlplus scott/tiger

SQL> select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET               CL8MSWIN1251                             -- однобайтовая бд
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_RDBMS_VERSION              11.2.0.3.0

SQL> create table nls_test(lang char(2), text varchar2(100));

Table created.

SQL> insert into nls_test values('RU', 'Текст на русском языке');

1 row created.

SQL> insert into nls_test values('IW', 'םוןםי OIJOI םןחארגארארג');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from nls_test;                                     -- в кириллической кодировке на клиенте 1251

LAN TEXT
--- ----------------------------------------------------------------------------------------------------
RU  Текст на русском языке                                       -- 1251 отображается правильно
IW  непнй OIJOI нпзашвашашв                                      -- 1255 отображается кириллицей

SQL> select * from nls_test;                                     -- в иностранной кодировке 1255

LAN TEXT
--- ----------------------------------------------------------------------------------------------------
RU  ׂוךסע םא נףססךמל �ח�ךו                                       --  всё отображается некириллическими символами
IW  םוןםי OIJOI םןחארגארארג

Преобразование символов в UTF8 коды в бд с однобайтовой кодировкой, как я понимаю, затруднительна:

SQL> select convert(text, 'CL8MSWIN1251', 'AL32UTF8') FROM scott.nls_test;
select convert(text, 'CL8MSWIN1251', 'AL32UTF8') FROM scott.nls_test
                                                            *
ERROR at line 1:
ORA-12703: this character set conversion is not supported

На соседней бд с UTF кодировкой, естественно, при использовании UTF шрифтов на клиенте (putty Translation -> UTF):

$ set | grep 'LANG\='
LANG=en_US.UTF-8
NLS_LANG=AMERICAN_CIS.UTF8

SQL> select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

VALUE
-----
UTF8

SQL> create database link scott_db1251 connect to scott IDENTIFIED BY tiger using 'db1251';

Database link created.

SQL> select
       decode( lang, 'IW ', UTL_I18N.raw_to_char(UTL_I18N.STRING_TO_RAW(text, 'CL8MSWIN1251'), 'IW8MSWIN1255')
  3                , 'RU ', UTL_I18N.raw_to_char(UTL_I18N.STRING_TO_RAW(text, 'CL8MSWIN1251'), 'CL8MSWIN1251')
  4                , 'Unknown language') as "Text"
  5  FROM nls_test@scott_db1251;

Text
------------------------------------------------------------
Текст на русском языке
                                     םוןםי OIJOI םןחארגארארג

Метод, мягко говоря, непрямой, но работает на встроенных технологиях Oracle — промежуточная UTF бд играет роль «перекодирующего клиента»

Вопрос: есть ли более простой способ?

Добавить комментарий »

Комментариев нет.

RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Блог на WordPress.com.

%d такие блоггеры, как: