oracle修改server段字符集

5.1 修改server端字符集(不建议使用)


  1. 关闭数据库


  SQL>SHUTDOWN IMMEDIATE


  2. 启动到Mount


  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


  注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start) 按上面的做法就可以。


  若出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 这样的提示信息,


  要解决这个问题有两种方法


  1. 利用INTERNAL_USE 关键字修改区域设置,


  2. 利用re-create,但是re-create有点复杂,所以请用internal_use


  SQL>SHUTDOWN IMMEDIATE;


  SQL>STARTUP MOUNT EXCLUSIVE;


  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 NATIONAL CHARACTER SET INTERNAL_USE UTF8;


  SQL>SHUTDOWN immediate;


  SQL>startup;


  如果按上面的做法做,National charset的区域设置就没有问题


  5.2 修改dmp文件字符集


  上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。


  具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。


  比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:


  SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;


  0354


  然后将dmp文件的2、3字节修改为0354即可。


  如果dmp文件很大,用ue无法打开,就需要用程序的方法了。


  5.3客户端字符集设置方法


  1)UNIX环境


  $NLS_LANG=“simplified chinese”_china.zhs16gbk


  $export NLS_LANG


  编辑oracle用户的profile文件




********************************************************
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




SQL> ALTER DATABASE character set INTERNAL_USE zhs16gbk;      


Database altered.

你可能感兴趣的:(oracle)