2

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

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

数据库中的数据1:ÎNTREPRINDERE INDIVIDUALĂ

database2 中的数据:?NTREPRINDERE 个人?

有人可以解释为什么(字节表示)以及解决方案是什么(不仅仅是修改nls_characterset)?

4

1 回答 1

1

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

演示

我有一个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 应该允许存储罗马尼亚字符,因此它们应该通过 DB 链接毫无问题地传输。然而,在你的情况下,他们没有。

于 2019-11-04T09:42:46.797 回答