Monthly Archives: April 2014

Oracle不同字符集的dblink乱码问题解决办法

因为一个非常操蛋的原因,公司有2个Oracle数据库用了不同的字符集,一个是UTF8,一个是GBK。悲剧的是,两个数据库还必须通过dblink进行一些互访操作。如果字段内容含有中文,则会存在乱码问题。解决方案是通过utl_raw.cast_to_raw和convert两个函数进行字符集转换。

数据库 字符集 表名 指向对方的DBLINK
idata AMERICAN_AMERICA.UTF8 url_upgroup_dimt0 DL_ALIDW_CBUDP
alidw AMERICAN_AMERICA.US7ASCII jobs_category DL_IDATA_CNLOG

1. UTF8通过DBLINK访问GBK

步骤一、在GBK库alidw上创建视图,其中带中文的字段使用utl_raw.cast_to_raw转成RAW编码

create or replace view cbudp.v_jobs_category as
select
id,
utl_raw.cast_to_raw(jobs_category_name) jobs_category_name,
parent_id,
bu_name,
gmt_create,
gmt_modified
from cbudp.jobs_category;

步骤二、在UTF8库idata上创建视图,其中带中文的字段使用Convert进行转码

create or replace view jobs_category as
select
id,
convert(utl_raw.cast_to_varchar2(jobs_category_name),’utf8′,’zhs16gbk’) jobs_category_name,
parent_id,
bu_name,
gmt_create,
gmt_modified
from cbudp.v_jobs_category@dl_alidw_cbudp;

2. GBK通过DBLINK访问UTF8

步骤一、在UTF8库idata上创建视图,其中带中文的字段使用utl_raw.cast_to_raw转成RAW编码

create or replace view cnlog.v_url_upgroup_dimt0 as
select
upgroup_id,
utl_raw.cast_to_raw(upgroup_desc) upgroup_desc,
ins_date
from cnlog.url_upgroup_dimt0;

步骤二、在GBK库alidw上创建视图,其中带中文的字段使用Convert进行转码

create or replace view cnlog.url_upgroup_dimt0 as
select
upgroup_id,
convert(utl_raw.cast_to_varchar2(upgroup_desc),’zhs16gbk’,'utf8′) upgroup_desc,
ins_date
from cnlog.v_url_upgroup_dimt0@dl_idata_cnlog;


Data Warehouse For Ever原创文章,转载请注明出处