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關於字元集的分析
Oracle資料庫字元集研究