Oracle数据库编码问题

Oracle database encoding problems

我们有两个 Oracle 数据库。我们通过dblink从database2中的database1读取数据。 在数据库 1 中,我们有 NLS_CHARACTERSET = AL32UTF8,在数据库 2 中,我们有 NLS_CHARACTERSET = EE8ISO8859P2.

问题是读取database2中的数据不对。一些特殊字符是错误的。例如:

database1 中的数据:ÊNTREPRINDERE INDIVIDUALĂ

数据库 2 中的数据:?NTREPRINDERE INDIVIDUAL?

谁能解释一下为什么(字节表示)以及解决方案是什么(比修改nls_characterset的多)?

我在评论中建议的类型转换似乎有效(对我而言)。

演示

我有一个 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'Сегодня замечательный день, чтобы помочь людям на whosebug.com.');

commit;

在本地数据库...

SQL> select xxx from test_the_charset@my_remote_db;

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

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

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

SQL> 

至于"why this happens"...

我不知道。根据定义,ISO8859-2 应该允许存储罗马尼亚字符,因此它们应该通过 DB link 毫无问题地传输。然而,就您而言,他们没有。