Oracle 字符集修改(ORA-29275 )

2015-02-02 20:42:10 · 作者: · 浏览: 5

今天有朋友数据库出现ORA-29275 部分多字节字符,对应的字段只能用to_char才能正常查询,感觉是字符集问题。询问之果然修改过字符集。


他的修改方式:


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 INTERNAL_USE ZHS16GBK;


查看数据库


SQL> select name,value$ from props$ where name like '%NLS%';


NAME? ? ? ? ? ? ? ? ? ? ? ? ? VALUE$
------------------------------ ------------------------------
NLS_LANGUAGE? ? ? ? ? ? ? ? ? AMERICAN
NLS_TERRITORY? ? ? ? ? ? ? ? ? AMERICA
NLS_CURRENCY? ? ? ? ? ? ? ? ? $
NLS_ISO_CURRENCY? ? ? ? ? ? ? AMERICA
NLS_NUMERIC_CHARACTERS? ? ? ? .,
NLS_CHARACTERSET? ? ? ? ? ? ? ZHS16GBK
NLS_CALENDAR? ? ? ? ? ? ? ? ? GREGORIAN
NLS_DATE_FORMAT? ? ? ? ? ? ? ? DD-MON-RR
NLS_DATE_LANGUAGE? ? ? ? ? ? ? AMERICAN
NLS_SORT? ? ? ? ? ? ? ? ? ? ? BINARY
NLS_TIME_FORMAT? ? ? ? ? ? ? ? HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT? ? ? ? ? DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT? ? ? ? ? ? HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT? ? ? ? DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY? ? ? ? ? ? ? $
NLS_COMP? ? ? ? ? ? ? ? ? ? ? BINARY
NLS_LENGTH_SEMANTICS? ? ? ? ? BYTE
NLS_NCHAR_CONV_EXCP? ? ? ? ? ? FALSE
NLS_NCHAR_CHARACTERSET? ? ? ? AL16UTF16
NLS_RDBMS_VERSION? ? ? ? ? ? ? 11.2.0.1.0


确实已经修改好了。但是这里:


ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;


是非常有问题的,这里跳过字符集子集检查,强制进行修改。


所以以后的数据将会出现问题。


那么我们使用exp/imp在导出的时候指定字符集进行转换呢?


引入一篇文章的部分段落:


9i之前的版本:在源数据库的字符集和export的session的NLS_LANG设置不同时,所有数据的字符集(用户数据和字典数据)均会转换;


在import过程中,如果import session的NLS_LANG和export时不一致,将会将dmp中的字符集转换成import session的NLS_LANG设置成的字符集;


当import session的NLS_LANG和目标数据库的字符集不一致时,将会发生公import session的NLS_LANG字符集到目标数据库的字符集转换


9i及之后的版本:在源数据库的字符集和export的session的NLS_LANG设置不同时,只有字典数据会发生字符集转换,用户数据则和源数据库的字符集一致,而忽略NLS_LANG的设置;


在import过程中,如果import session的NLS_LANG和export时不一致,将会将dmp中的字符集转换成import session的NLS_LANG设置成的字符集;


当import session的NLS_LANG和目标数据库的字符集不一致时,将会发生公import session的NLS_LANG字符集到目标数据库的字符集转换


其实都没关系,不管你用什么办法转换,只要转换的字符集不是原字符集的超集都是有问题的:


所以我们在修改数据库字符集的时候,执行如下语句:


ALTER DATABASE CHARACTER SET ZHS16GBK


如果没有报:


SYS@zbdba>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


那说明可以修改。如果有以上错误,建议不要修改强制修改字符集