Проблемы с кодировкой базы данных Oracle - PullRequest
2 голосов
/ 31 октября 2019

У нас есть две базы данных Oracle. Мы читаем данные из database1 в database2 через dblink. В базе данных1 у нас есть NLS_CHARACTERSET = AL32UTF8, а в базе данных2 NLS_CHARACTERSET = EE8ISO8859P2.

Проблема в том, что чтение данных в базе данных2 неправильно. Некоторые специальные символы не правы. Например:

Данные в базе данных1: ÎNTREPRINDERE INDIVIDUALĂ

Данные в базе данных2:? NTREPRINDERE INDIVIDUAL?

Может кто-нибудь объяснить, почему (представление байтов) и какие решения (являютсябольше, чем один, чтобы изменить nls_characterset)?

1 Ответ

1 голос
/ 04 ноября 2019

Типирование, которое я предложил в своем комментарии, похоже, работает (для меня).

Демо

У меня есть AL32UTF8 удаленная БД и EE8MSWIN1250Локальная БД в моем распоряжении, поэтому мне пришлось использовать что-то отличное от румынского, так как эти символы присутствуют в кодовой странице cp1250. Зашел на какой-то русский, потом.

На удаленной БД ...

create table test_the_charset (xxx varchar2(256 char));

insert into test_the_charset (xxx)
values (n'ÎNTREPRINDERE INDIVIDUALĂ');

insert into test_the_charset (xxx)
values (n'Сегодня замечательный день, чтобы помочь людям на StackOverflow.com.');

commit;

На локальной БД ...

SQL> select xxx from test_the_charset@my_remote_db;

XXX
--------------------------------------------------------------------------------
ÎNTREPRINDERE INDIVIDUALĂ
??????? ????????????? ????, ????? ?????? ????? ?? StackOverflow.com.

SQL> select cast(xxx as nvarchar2(2000)) from test_the_charset@my_remote_db;

CAST(XXXASNVARCHAR2(2000))
--------------------------------------------------------------------------------
ÎNTREPRINDERE INDIVIDUALĂ
Сегодня замечательный день, чтобы помочь людям на StackOverflow.com.

SQL> 

Что касается "почему это происходит" ...

Я не знаю. ISO8859-2 должен, по определению, разрешать хранение румынских символов, поэтому они должны передаваться по ссылке в БД без проблем. Тем не менее, в вашем случае, они не делают.

...