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