Oracle 数据库早期版本是不支持数据库字符集变更,一旦创建数据库是无法进行变更的.从8i开始支持数据库字符集变更,但一定得是严格意义上的字符集子集向超集变更.子集超集列表可见(http://hi.baidu.com/flying%5Fhg/blog/item/b90c5d0949e8638bd1581bf1.html),具体操作示例如下:
SHUTDOWN IMMEDIATE;
– make sure there is a database backup you can rely on, or create one
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET ZHS32GB18030;
SHUTDOWN;
一般现实环境中,严格意义上的子集到超集变更是很少的.像很多人误认为的ZHS16GBK 是ZHS16CGB231280的严格超集(虽然后者的汉字在前者中都存在,但是同样的编码在不同两个
字符集中可能表达不同的汉字),是无法通过上述方式正常变更的.
在这种情况下,Oracle提供的标准方式是使用新字符集重建数据库,然后导出,导入.但这种方式较烦琐.还有另外一种非Oracle支持的方式,操作如下:
一, 使用CSSCAN扫描
1, 安装Csscan Csmig Schema
cd $ORACLE_HOME/rdbms/admin
set oracle_sid=<your SID>
sqlplus /nolog
SQL>conn / as sysdba
SQL>set TERMOUT ON
SQL>set ECHO ON
SQL>spool csminst.log
SQL>@?/rdbms/admin/csminst.sql
2, 使用CSSCAN程序扫描数据库
set oracle_sid=<your SID>
set PATH=<oracle home bin>
csscan system full=y tochar=ZHS32GB18030 capture=y array=1000000 process=2
查看日志,转换的字符集是否有严重损坏,或者能否有其它方式转换后进行变更.如果确认没问题的话,可以进行下一步.注意由于不是Oracle支持的方式,请动作前备份系统.
可参考metalink doc:
Note 745809.1 Installing and configuring CSSCAN in 10g and 11g
Note 458122.1 Installing and configuring CSSCAN in 8i and 9i
二, 数据库字符集变更
SHUTDOWN IMMEDIATE;
– make sure there is a database backup you can rely on, or create one
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS32GB18030;
SHUTDOWN;
此操作与正常操作多了一个INTERNAL_USE,经分析,加此参数后,数据库在变更时不会判断子集和超集的关系,因此具有一定的风险,csscan和系统全备是必不可少的.