Welcome 微信登录

首页 / 数据库 / MySQL / Oracle 字符集修改(ORA-29275 )

今天有朋友数据库出现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那说明可以修改。如果有以上错误,建议不要修改强制修改字符集Oracle关于字符集的分析  http://www.linuxidc.com/Linux/2014-09/107086.htmOracle数据库字符集研究 http://www.linuxidc.com/Linux/2014-03/97741.htm更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址