闵毓
http://www.eshoo.com.cn 欢迎来到异客中国
posts - 49,comments - 97,trackbacks - 0
oracle 数据库具有国际化的支持能力, 主要通过字符集等 NLS(National Language Support)  参数设置来实现对不同国家语言环境的支持。其中数据库的字符集是在数据库创建的阶段, 即 create database 语句中指定的,数据库一经建立,字符集就没法改变了,除非重建。我们最常用的字符集设置通常为 zhs16cgb231280(国标2312字库) 和 ZHS16GBK(方正 GBK 字库)。GBK是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容国标GB2312-80标准(只实现了6763个汉字)。

在项目开发和维护过程中我们经常会遇见下面的情况, 使用 ZHS16CGB231280 字符集的oracle 系统中,姓名中出现的很多疑难汉字无法正常显示(显示为 ??)。

    遇见这种情况以往最常见的处理方法是导出数据(exp), 用 ZHS16GBK 字符集重建数据库,最后再导入(imp)数据。但这个过程对于一个大型数据库来说很漫长和痛苦。这里给大家介绍一个比较快速简单的方法,几分钟就能实现字符集转换。这里以 oracle9i为例(8i中的操作略有不同)。

1.        作为 oracle 用户登录数据库服务器

2.        停止监听程序
                   $lsnrctl stop
                   或
                   $lsnrctl stop  listener名称

3.        作为 sysdba 登录数据库, 并检查目前的数据库字符集设置
                   sqlplus /nolog
                   connect /as sysdba
                   select value$ from props$ where name ='NLS_CHARACTERSET';

如果上述查询结果为 ZHS16CGB231280, 则进行如下操作:

4.        保存下列数据库配置参数的原始设置
             show parameter job_queue_processes
             show parameter aq_tm_processes

5.        关闭数据库服务,重新启动后修改数据库字符集, 并关闭数据库
              shutdown immediate
              startup mount
              alter system enable restricted session;
              alter database open;
              alter system set job_queue_processes = 0;
              alter system set aq_tm_processes = 0;
              alter database character set internal_use zhs16gbk;
              shutdown immediate

6.        重新启动数据库服务,恢复 job_queue_processes设置
             startup
             alter system set job_queue_processes=原始设置;
             alter system set aq_tm_processes=原始设置;
             exit

7.        启动监听程序
             $lsnrctl start
             或
             $lsnrctl start  listener名称

8.        修改客户端 NLS_LANG 设置
             windows 客户端在注册表中修改 NLS_LANG 参数:
             nls_lang=”American_america.zhs16gbk”

    注意,这里要指出的是, 字符集间的转换可能会造成数据库信息破坏,如把 ZHS16GBK 的oracle 数据库转换为 zhs16cgb231280, 其中的疑难汉字就会变成同样的??, 有时甚至造成主键重复活违反唯一索引等问题。可能很少有人知道, Oracle 其实提供了一个应用程序 csscan, 可以用来检测字符集转换后数据库的内容是否会被破坏。要使用 csscan 程序必须先以 sysdba 的身份执行 $ORACLE_HOME/rdbms/admin 目录下的 csminst.sql。csscan help=y 可以得到关于 csscan 命令使用方法的帮助。
posted on 2005-10-20 12:34 闵毓 阅读(586) 评论(0)  编辑  收藏 所属分类: 数据库心得与体会

只有注册用户登录后才能发表评论。


网站导航: