您的位置:首页 > 数据库 > Oracle

oracle跨数据库通讯乱码问题

2015-01-20 21:25 351 查看
oracle不同数据库之间可以通过DBLINK进行通讯,但是如果两个数据库是不同字符集,那么在获取中文字符时可能显示的就是乱码。

假设:

数据库A字符集为SIMPLIFIED CHINESE_CHINA.ZHS16GBK

下有表AA



数据库B字符集为AMERICAN_AMERICA.WE8ISO8859P1

在数据库B上建立连结A的DBLINK:

create database link test
connect to system identified by password
using 'test';</span>


说明:ORACLE10G以下版本对密码大小写不敏感,除非在设置密码的时候将密码加上双引号,否则大小写密码都可以登录系统,11g开始密码默认区分大小写,所以在连结11g数据库或者其他异构数据库时需要将密码加上双引号。
现在我们在B库查询一下A库的aa表:

select * from aa@test



数据是查询出来了,但是中文部分变成了靠!

没关系,我们可以通过utl_raw.cast_to_raw函数在A库将有中文的列转换为16进制,为了以后长期使用我们建立一个视图:

create view v_aa as
select a1, utl_raw.cast_to_raw(a2) a2 from aa;


查询一下

select * from v_aa;




在B库上通过utl_raw.cast_to_varchar2将16进制再转换为中文,我们同样建一个视图:

create or replace view v_aa as
select a1, utl_raw.cast_to_varchar2(a2) a2 from v_aa@test;


查询一下

select * from v_aa;




OK,大功告成!

不过在有些特殊环境下,按这种方法查询出来的还是乱码,可能是那个数据库的字符集比较特殊,我们可以将A库的字符集先转换成我们指定的字符集,再转换成16进制

如:

select   UTL_RAW.cast_to_raw( Convert('中文123','ZHS16CGB231280'))  from dual;


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息