Oracle 字元集修改(ORA-29275 )

來源:互聯網
上載者:User

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資料庫字元集研究

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.