探索Oracle之 EXP/IMP過程中的字元集問題,oracleimp

來源:互聯網
上載者:User

探索Oracle之 EXP/IMP過程中的字元集問題,oracleimp

1. 問題描述:

       資料庫之間的資料移轉是一個很常見的作業,EXP/IMP工具是一個常用的資料移轉及轉化工具,因其匯出檔案具有平台無關性,所以在跨平台遷移中,最為常用。但在實際操作過程中,涉及到來源資料庫,用戶端,目標資料庫三方面的字元集問題。操作人員對三者之間的字元集轉換過程不瞭解,而冒然使用EXP/IMP命令,往往在遷移過程中報錯終止,或是在沒有報錯的情況下成功匯入,但其背後卻存在隱患,在查詢時經常顯示亂碼。

 

2.解決方案

       2.1 源端資料庫(1)→EXP用戶端(2)→IMP用戶端(3)→目標資料庫(4),資料在遷移過程中要經曆如上的4個點,資料在流動過程中(如上的3個箭頭)需要依次比較箭頭兩端的字元集,如果相同則不轉換,如果不同則進行轉換。如果相鄰的兩個點之間設定的字元集均不相同,則需要轉換3次。

 

       根據上述理論分析,最好的設定方式是,因為(1)(4)資料庫的字元集是固定的,則設定用戶端的字元集(2)(3)均與(1)相同,這樣最多隻在(3)→(4)的過程中發生一次字元集的轉換。但是前提是(4)的字元集必須是(1)的的字元集的超集。用戶端字元集是通過環境變數NLS_LANG來設定。

Linux: export NLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBKWindows: set NLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK

      EXP匯出的檔案,可以通過WINDOWS上的工具UE來查看,其中第一行的第2,3個位元組顯示的數字代表了檔案的字元集。在sqlplus裡通過select nls_charset_name() from dual;可以查看該數字代表的字元集。


03 03 54 45 58 50 4F 52 54 3A

其中,03 54是16進位的數字,代表了一種字元集。將其轉換為10進位為:

SQL> select to_number('0354','xxxx') from dual;TO_NUMBER('0354','XXXX')------------------------                     852查詢852代表的字元集SQL> select nls_charset_name(852) from dual;NLS_CHAR--------ZHS16GBK當然還可以逆向操作SQL> select nls_charset_id('ZHS16GBK') from dual;NLS_CHARSET_ID('ZHS16GBK')--------------------------                       852

       2.2 ORACLE在10g以後的版本中提供了新的遷移工具EXPDP/IMPDP,此工具無需設定用戶端字元集,而是由ORACLE自動去識別並完全字元集的轉換。這是因為EXPDP/IMPDP並不是完整意義上的用戶端,它和EXP/IMP/sqlplus並不完全一樣。它只是向oracle傳輸了一個命令,oracle在內部產生一個任務,檔案只能匯出在伺服器上,而不能像exp/imp一樣將檔案匯出到遠程端。但前提依然是,目標資料庫的字元集應是來源資料庫字元集的超集。

 

      其實,在使用exp/imp,expdp/impdp時,並不一定要嚴格要求目的資料庫是來源資料庫的超集。問題的關鍵之處在於源端的字元能在目的端找到對應的字元。在不同字元集的資料庫傳輸之前,我們最好通過oracle提供的csscan工具來檢查兩個字元集之間是否可以轉換。



oracle exp/imp字元集導致中文亂碼

在哪裡執行exp/imp哪裡就是用戶端,執行匯入/匯出之前都要先設定環境變數
WIN:set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

UNIX:EXPORT NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

這兩個字元集沒有任何內含項目關聯性,不能這樣直接轉換
如果資料量不大,資料類型不複雜,可以考慮把它轉換為文字檔,再放入目標資料庫
推薦兩個工具 sqluldr2 搜尋一下,網上有,用於倒出資料庫文本
sqlldr 是oracle內建工具,用於將資料倒入目標資料庫
兩個工具配合使用,應該可以完成你的字元集轉換
 
imp後表中漢字正常,預存程序漢字亂碼,怎解決?與exp時字元集一樣的

我認為是用戶端字元集的問題
Oracle進行字元轉換的時候,需要檢查你的用戶端的字元集設定
我記得是NLS_LANG變數,不是你查的LANG
試試設定一次NLS_LANG=AMERICAN_AMERICA.AL32UTF8試試
兩邊都是!
我也很好奇,原理上是這樣,不知道是否可行
 

相關文章

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.