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