oracle imp字元集問題的解決____oracle
來源:互聯網
上載者:User
問題:
在imp一個dmp檔案的時候,提示不支援要求的字元集轉換(從類型 850到 852).
原理:
ORACLE多國語言設定是為了支援世界範圍的語言與字元集,一般對語言提示,貨幣形式,排序方式和CHAR,VARCHAR2,CLOB,LONG欄位的資料的顯示等有效。ORACLE的多國語言設定最主要的兩個特性就是國家語言設定與字元集設定,國家語言設定決定了介面或提示使用的語言種類,字元集決定了資料庫儲存與字元集有關資料(如文本)時候的編碼規則。
ORACLE字元集設定,分為資料庫字元集和用戶端字元集環境設定。在資料庫端,字元集在建立資料庫的時候設定,並儲存在資料庫props$表中,對於8i以上產品,已經可以採用'Alter database character set 字元集'來修改資料庫的字元集,但也僅僅是從子集到超集,不要通過update props$來修改字元集,如果是不支援的轉換,可能會失去所有與字元集有關的資料,就是支援的轉換,也可能導致資料庫的不正常工作。字元集分為單一位元組字元集與多位元組字元集,US7ASCII就是典型的單一位元組字元集,在這種字元集中length=lengthb,而ZHS16GBK就是常用的雙位元組字元集,在這裡lengthb=2*length。
在用戶端的字元集環境比較簡單,主要就是環境變數或登錄機碼NLS_LANG,注意NLS_LANG的優先順序別為:參數檔案à註冊表à環境變數àalter session。NLS_LANG的組成為“國家語言設定.字元集”,如nls_lang=simplified chinese_china.zhs16gbk。用戶端的字元集最好與資料庫端一樣(國家語言設定可以不一樣,如zhs16gbk的字元集,用戶端可以是nls_lang =simplified chinese_china.zhs16gbk或Ameircan_America.zhs16gbk,都不影響資料庫字元的正常顯示),如果字元集不一樣,而且字元集的轉換也不相容,那麼用戶端的資料顯示與匯出/匯入的與字元集有關的資料將都是亂碼。
方案:
使用2進位檔案編輯工具,如uedit32。開啟匯出的dmp檔案,擷取2、3位元組的內容,如00 01,先把它轉換為10進位數,為1,使用函數NLS_CHARSET_NAME即可獲得該字元集:
SQL> select nls_charset_name(1) from dual;
NLS_CHARSET_NAME(1)
-------------------
US7ASCII
可以知道該dmp檔案的字元集為US7ASCII,如果需要把該dmp檔案的字元集換成ZHS16GBK,則需要用NLS_CHARSET_ID擷取該字元集的編號:
SQL> select nls_charset_id('zhs16gbk') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
852
把852換成16進位數,為354,把2、3位元組的00 01換成03 54,即完成了把該dmp檔案字元集從us7ascii到zhs16gbk的轉化,這樣,再把該dmp檔案匯入到zhs16gbk字元集的資料庫就可以了。