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 命令使用方法的帮助。