一 修改数据库server端字符集
数据库字符集在创建后原则上不能更改。如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换,或通过alter database character set语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如utf8是us7ascii的超集,修改数据库字符集可使用alter database character set utf8。根据oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。
对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。
特别说明,我们最常用的两种字符集zhs16gbk和zhs16cgb231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
1 修改server端字符集方法
在oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:
$sqlplus /nolog
sql>conn / as sysdba;
若此时数据库服务器已启动,则先执行shutdown immediate命令关闭数据库服务器,然后执行以下命令:
sql>startup mount;
sql>alter system enable restricted session;
sql>alter system set job_queue_processes=0;
sql>alter system set aq_tm_processes=0;
sql>alter database open;
sql>alter database character set zhs16gbk;
sql>alter database national character set zhs16gbk;
sql>shutdown immediate;
sql>startup
2 修改server端字符集方法(可以跳过超集的检查)
使用internal_use可以跳过超集的检查,alter database character set internal_use 加这个以后,就可以彻底解决修改的问题,即使报错也能修改.如:
alter database character set internal_use zhs16cgb231280;
alter database character set internal_use zhs16gbk;
sql> connect sys/oracle as sysdba
sql> startup mount
sql> alter session set sql_trace=true;
sql> alter system enable restricted session;
sql> alter system set job_queue_processes=0;
sql> alter system set aq_tm_processes=0;
sql> alter database open;
sql> set linesize 120;
sql> alter database character set zhs16gbk;
报错:
alter database character set zhs16gbk
error at line 1:
ora-12712: new character set must be a superset of old character set
# 使用internal_use可以跳过超集的检查,alter database character set internal_use
sql> alter database character set internal_use zhs16gbk;
sql> shutdown immediate;
sql> startup
sql> select name,value$ from props$ where name like '%nls%';
nls_characterset
zhs16gbk
二 客户端字符集(nls_lang参数)
1 客户端字符集含义
客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如sqlplus,exp/imp等。客户端字符集是通过设置nls_lang参数来设定的。
2 查询oracle client端的字符集
这个比较简单。在windows平台下,就是注册表里面相应oraclehome的nls_lang。
还可以在dos窗口里面自己设置,比如:
set nls_lang=american_america.zhs16gbk
这样就只影响这个窗口里面的环境变量。
在unix平台下,就是环境变量nls_lang。
$echo $nls_lang
american_america.zhs16gbk
如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。
3 客户端字符集设置方法
1)unix环境
$nls_lang=“simplified chinese”_china.zhs16gbk
$export nls_lang
编辑oracle用户的profile文件
或者是临时改变export nls_lang="simplified chinese_china.zhs16gbk"
2)windows环境
编辑注册表
regedit.exe---hkey_local_machine---software---oracle—home0