oracle以其强大的数据库管理能力、高安全性、多用户操作时数据的一致性,赢得了用户的广泛青睐,获得了很高的市场占有率。但是,它在汉字信息显示时存在多种字符集,且相互之间不能通用,这就给多数据库之间的数据共享带来了一些麻烦。
oracle以其强大的数据库管理能力、高安全性、多用户操作时数据的一致性,赢得了用户的广泛青睐,获得了很高的市场占有率。但是,它在汉字信息显示时存在多种字符集,且相互之间不能通用,这就给多数据库之间的数据共享带来了一些麻烦。
笔者从事oracle数据库管理及应用软件的开发工作多年,常遇到oracle数据库汉字显示的问题,主要现象是汉字显示为不可识别的乱码,信息无法使用。本文介绍笔者在实际工作中的一点心得,与大家一起探讨。
中英文oracle之间的数据共享
在笔者的实际工作中,有为多个二级厂矿开发的基于oracle数据库的应用程序,而各个单位所用的oracle数据库,在安装时所采用的字符集各不相同,有的用英文字符集,有的用中文字符集。当表中的数据只是数字、英文信息时,数据共享是可以的; 当表中含有汉字信息时,以正常的方式进行共享,就看不到汉字了,而只会见到一些乱码。下面以oracle 7.3版的数据库为例说明解决方法。
假设源数据库是中文字符集,目标数据库是英文字符集,利用 delphi作为转换工具。实际的步骤依据导入和导出有所不同,导出数据时步骤如下:
1. 配置客户端字符集
首先将本机oracle客户端的字符集配置得和源数据库的字符集一致。打开注册表,找到hkey_local_machine,选下面的software,再选oracle,在注册表中找到nls_lang,将值改为:american_america.zhs16cgb231280。
2. 配置数据库别名
用delphi的工具sql explorer配置两个数据库假名,其中dbsource1用来连接源数据库,dbmiddle1用来连接中间数据库(paradox表)。
3. 导出
打开delphi的工具database desktop,在主菜单中选tools下面的utilities,再选copy,会弹出一个新的对话框,在alias(数据库别名)中选择dbsource1,并输入用户口令。在打开的数据库中选择需要的表,点击ok按钮。在alias(数据库别名)中选择dbmiddle1。在file name栏中输入目标表名,点击copy按钮,如果显示: copy successfully completed,则数据导出成功。
导入数据时步骤如下:
1. 配置客户端字符集
首先将本机oracle客户端的字符集配置得和目标数据库的字符集一致。打开注册表,找到hkey_local_machine,选下面的software,再选oracle,在注册表中找到nls_lang,将值改为:american_america.us7ascii。
2. 配置数据库别名
用delphi的工具sql explorer配置一个数据库别名:dbtarget1,用来连接目标数据库。
3. 导入
打开delphi的工具database desktop,在主菜单中选tools下面的utilities,再选copy,会弹出一个新的对话框,在alias(数据库别名)中选择dbmiddle1。在打开的数据库中选择需要的表,点击ok按钮。在alias(数据库别名)中选择dbtarget1,并输入用户口令。在file name栏中输入目标表名,点击copy按钮,如果显示: copy successfully completed,则数据导入成功。此时,在目标数据库中查看导入的表,汉字显示就正常了。
小型机和pc服务器之间的数据共享
笔者所在公司有小型机alpha 2100作为数据库服务器,上面有多个二级单位使用。随着时间的推移,数据增加,用户增加,小型机不堪重负,运行速度缓慢,不能满足日常的工作需要。为了缓解这种情况,有部分单位自备了pc服务器,将数据从小型机上移植下来,建立了自己单独的数据库。
两个数据库都安装的是英文字符集,从小型机上导出的数据,装入到pc服务器,遇到汉字信息也不能正常显示。这主要是因为两者的操作系统不同,小型机上是vms系统,而pc服务器上是nt 4.0,有两种方法可以解决这个问题:
1. 用仿真终端的方式将数据导出
用telnet连接到小型机上,执行exp,将某个用户的数据库导出为一个*.dmp文件,保存在pc服务器上。
2. 用ftp将数据取到本机
用ftp连接到小型机上,执行bin,再执行get,将数据(*.dmp文件)以二进制的方式传输到本机。注意这里必须用二进制方式,否则数据无法正常使用。
得到小型机上的数据后,再将本机客户端配置得和pc服务器的字符集一致,将数据导入pc服务器数据库中,则一切数据均可使用了。
数据库升级 在数据库的使用中常会遇到oracle的版本升级,如何在保证原来数据安全的情况下,将数据库平稳地升级?这里分两种情况:
1. 英文字符集的安装
如果原来的数据库安装采用的是英文字符集,则从oracle 7.3升级到oracle 8.0.5时,只要将数据字典props$中的参数修改为“us7ascii”即可。
以系统dba的身份登录sql*plus,执行如下的命令,修改数据字典:
sql>update props$ set value$=‘us7ascii’where name=‘nls_characterset’; sql>commit; |
注意,修改后必须重新启动数据库,配置才起作用,然后将从oracle
2. 中文字符集的安装
如果原来的数据库安装采用的是中文字符集,直接将数据导入,是否可用呢?不可以,汉字显示为乱码。
原因是oracle 7.3的中文字符集的参数是:zhs16cgb231280,而oracle 8.0.5的中文字符集的参数是:zhs16gbk。两者不一样,为了能正常地使用,必须修改oracle 8.0.5的数据字典的参数为:zhs16cgb231280。具体的修改步骤如下, 用系统dba的身份登录sql*plus,执行:
sql>update props$ set value$=‘zhs16cgb231280’where name=‘nls_characterset’; sql>commit; |
注意,修改后必须重新启动数据库,配置才起作用,然后将从oracle 7.3导出的数据,导入oracle 8.0.5的数据库中即可。
阅读关于 oracle数据库 汉字显示 总结 的全部文章