Oracle以其强大的数据库管理能力高安全性多用户操作时数据的一致性赢得了用户的广泛青睐获得了很高的市场占有率但是它在汉字信息显示时存在多种字符集且相互之间不能通用这就给多数据库之间的数据共享带来了一些麻烦
笔者从事Oracle数据库管理及应用软件的开发工作多年常遇到Oracle数据库汉字显示的问题主要现象是汉字显示为不可识别的乱码信息无法使用本文介绍笔者在实际工作中的一点心得与大家一起探讨
中英文Oracle之间的数据共享
在笔者的实际工作中有为多个二级厂矿开发的基于Oracle数据库的应用程序而各个单位所用的Oracle数据库在安装时所采用的字符集各不相同有的用英文字符集有的用中文字符集当表中的数据只是数字英文信息时数据共享是可以的; 当表中含有汉字信息时以正常的方式进行共享就看不到汉字了而只会见到一些乱码下面以Oracle 版的数据库为例说明解决方法
假设源数据库是中文字符集目标数据库是英文字符集利用 Delphi作为转换工具实际的步骤依据导入和导出有所不同导出数据时步骤如下
> 配置客户端字符集
首先将本机Oracle客户端的字符集配置得和源数据库的字符集一致打开注册表找到HKEY_LOCAL_MACHINE选下面的SOFTWARE再选Oracle在注册表中找到NLS_LANG将值改为AMERICAN_AMERICAZHSCGB
配置数据库别名
用Delphi的工具SQL EXPLORER配置两个数据库假名其中DBSOURCE用来连接源数据库DBMIDDLE用来连接中间数据库(Paradox表)
导出
打开Delphi的工具Database DeskTop在主菜单中选Tools下面的Utilities再选Copy会弹出一个新的对话框在Alias(数据库别名)中选择DBSOURCE并输入用户口令在打开的数据库中选择需要的表点击OK按钮在Alias(数据库别名)中选择DBMIDDLE在File Name栏中输入目标表名点击COPY按钮如果显示: Copy Successfully Completed则数据导出成功
导入数据时步骤如下:
配置客户端字符集
首先将本机Oracle客户端的字符集配置得和目标数据库的字符集一致打开注册表找到HKEY_LOCAL_MACHINE选下面的SOFTWARE再选Oracle在注册表中找到NLS_LANG将值改为AMERICAN_AMERICAUSASCII
配置数据库别名
用Delphi的工具SQL EXPLORER配置一个数据库别名DBTARGET用来连接目标数据库
导入
打开Delphi的工具Database DeskTop在主菜单中选Tools下面的Utilities再选Copy会弹出一个新的对话框在Alias(数据库别名)中选择DBMIDDLE在打开的数据库中选择需要的表点击OK按钮在Alias(数据库别名)中选择DBTARGET并输入用户口令在File Name栏中输入目标表名点击COPY按钮如果显示: Copy Successfully Completed则数据导入成功此时在目标数据库中查看导入的表汉字显示就正常了
小型机和PC服务器之间的
数据共享
笔者所在公司有小型机Alpha 作为数据库服务器上面有多个二级单位使用随着时间的推移数据增加用户增加小型机不堪重负运行速度缓慢不能满足日常的工作需要为了缓解这种情况有部分单位自备了PC服务器将数据从小型机上移植下来建立了自己单独的数据库
两个数据库都安装的是英文字符集从小型机上导出的数据装入到PC服务器遇到汉字信息也不能正常显示这主要是因为两者的操作系统不同小型机上是VMS系统而PC服务器上是NT 有两种方法可以解决这个问题:
用仿真终端的方式将数据导出
用Telnet连接到小型机上执行exp将某个用户的数据库导出为一个*dmp文件保存在PC服务器上
用FTP将数据取到本机
用FTP连接到小型机上执行bin再执行Get将数据(*dmp文件)以二进制的方式传输到本机注意这里必须用二进制方式否则数据无法正常使用
得到小型机上的数据后再将本机客户端配置得和PC服务器的字符集一致将数据导入PC服务器数据库中则一切数据均可使用了
数据库升级 在数据库的使用中常会遇到Oracle的版本升级如何在保证原来数据安全的情况下将数据库平稳地升级?这里分两种情况
英文字符集的安装
如果原来的数据库安装采用的是英文字符集则从Oracle 升级到Oracle 时只要将数据字典Props$中的参数修改为USASCII即可
以系统DBA的身份登录SQL*PLUS执行如下的命令修改数据字典
SQL>UPDATE PROPS$ SET VALUE$=USASCIIWHERE NAME=NLS_CHARACTERSET;
SQL>COMMIT;
注意修改后必须重新启动数据库配置才起作用然后将从Oracle
中文字符集的安装
如果原来的数据库安装采用的是中文字符集直接将数据导入是否可用呢?不可以汉字显示为乱码
原因是Oracle 的中文字符集的参数是ZHSCGB而Oracle 的中文字符集的参数是ZHSGBK两者不一样为了能正常地使用必须修改Oracle 的数据字典的参数为ZHSCGB具体的修改步骤如下 用系统DBA的身份登录SQL*PLUS执行
SQL>UPDATE PROPS$ SET VALUE$=ZHSCGBWHERE NAME=NLS_CHARACTERSET;
SQL>COMMIT;
注意修改后必须重新启动数据库配置才起作用然后将从Oracle 导出的数据导入Oracle 的数据库中即可