2024年5月11日发(作者:)
技术文档
Oracle 中英文字符集转换解决方案
背景说明:
目前国内用户使用的ORACLE字符集,大部分所采用的都是 ZHS16GBK – GBK 16位简体中文 ,
而很少采用US7ASCII – ASCII 7位美国英语 。
现在所遇到的问题就是,如何解决在US7ASCII字符集和ZHS16GBK字符集的数据库实例下进行
数据访问,以及进行导入、导出数据的时候出现汉字乱码的问题。
解决方案:
目前比较好的解决方案在网上几乎是没有的,也是行不通的,对于其他单位或许会有相应的解
决方案,但是也会因为是内部资料或者保密,或者流失。经过近期的研究,总算有了一个比较好的
解决方案。其中采用的主要方法是利用ORACLE的utl_raw包中的cast_to_varchar2()、
cast_to_raw()两个方法。服务器架构如下图所示:
应用服务器
业务数据库实例
(ZHS16GBK)
dblink
源数据库实例
(US7ASCII)
目标数据库服务器
源数据库服务器
图1.1 服务器数据存储结构
如上图所示,有两台服务器,目标要求在“应用服务器”访问的“目标数据库服务器”上能读
取“源数据库服务器”上的数据,但是由于“目标数据库服务器”和“源数据服务器”的数据库字
符集不一致,所以简单的建立一个dblink进行数据的访问就会出现汉字乱码的问题,所以还要进行
一些字符的转换工作,步骤如下:
1、首先在“源数据库服务器”上建立视图,供“目标数据库服务器”调用。视图建立的规则:
将视图中中文汉字的字段进行转换,转换函数为cast_to_raw(),
如 a表中有a1,a2,a3三个字段,其中a2字段内容为中文汉字,那么建立的视图的语句就
可以是:
create view v_a as
select a1 as a1, utl_raw
.
cast_to_raw(a2) as a2, a3 as a3 from a;
2、在“目标数据库服务器”建立dblink: 如:
create database link dbl_1
connect to test identified by test
using 'oradb';
3、在“目标数据库服务器”直接使用dblink进行数据访问,当然需要加上中文汉字转换函数
了。格式如下:
QQ- 154955209
技术文档
select a1, utl__to_varchar2(a2), a3 from v_a@bdl_1;
如上所示,我们基本就能完成在“目标数据服务器”对“源数据库服务器”的数据访问,但是
目前网站程序不允许实时去访问“源数据库服务器”,而且也不能在“源数据库服务器”建立视图。
所以要在自己的“目标数据库服务器”上同时建立一个ZHS16GBK业务数据库实例和一个US7ASCII
的中间转换数据库实例,通过“中间转换数据库实例”使用dblink连接“源数据库服务器”实现数
据的共享和实时连接,然后在“业务数据库实例”下通过dblink再连接“中间转换数据库实例”进
行字符集的转换。具体图示如下:
应用服务器
业务数据库实例
(ZHS16GBK)
dblink
中间转换数据库实例
(US7ASCII)
dblink
源数据库实例
(US7ASCII)
目标数据库服务器
源数据库服务器
图1.2 新版网站数据库服务器结构
具体实现方法如下:
1、在“目标数据库服务器”建立两个不同字符集的数据库实例;
注:这里在安装数据库实例的时候,最好先安装 US7ASCII ,再安装 ZHS16GBK。这样能保证操作系
统最后的字符集是ZHS16GBK,如果相反的话,则需要修改操作系统的注册表或者配置文件
(window注册表修改位置: HKEY_LOCAL_MACHINESOFTWAREORACLE ,搜索
NLS_LANG 键值,将其修改为 SIMPLIFIED CHINESE_16GBK)
2、在“中间转换数据库实例”建立dblink链接“源数据库实例”;
create database link CB_
connect to JYZX identified by "xzyj"
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.128.5.43)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dbast)
)
)';
3、在“中间转换数据库实例”建立视图访问“源数据库实例”的数据;以其中一个表作为例
子。
QQ- 154955209
发布评论