Oracle数据库编码问题

时间:2019-10-31 07:28:11

标签: oracle oracle12c nls-lang

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

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

数据库1中的数据:ÎNTREPRINDEREINDIVIDUALĂ

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

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

1 个答案:

答案 0 :(得分: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链接进行传输而不会出现问题。但是,就您而言,他们没有。