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 毫无问题地传输。然而,就您而言,他们没有。
我们有两个 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 毫无问题地传输。然而,就您而言,他们没有。