Oracle 字元集修改(ORA-29275 ),oracleora-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 AMERICANNLS_TERRITORY AMERICANLS_CURRENCY $NLS_ISO_CURRENCY AMERICANLS_NUMERIC_CHARACTERS .,NLS_CHARACTERSET ZHS16GBKNLS_CALENDAR GREGORIANNLS_DATE_FORMAT DD-MON-RRNLS_DATE_LANGUAGE AMERICANNLS_SORT BINARYNLS_TIME_FORMAT HH.MI.SSXFF AMNLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AMNLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZRNLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZRNLS_DUAL_CURRENCY $NLS_COMP BINARYNLS_LENGTH_SEMANTICS BYTENLS_NCHAR_CONV_EXCP FALSENLS_NCHAR_CHARACTERSET AL16UTF16NLS_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
那說明可以修改。如果有以上錯誤,建議不要修改強制修改字元集