天天看点

修改oracle字符集

一 修改数据库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