作為一個Oracle數據庫的用戶,對於Export和Import兩個命令絕對不會感到陌生,因為這二者正是我們經常用於數據備份和恢復的工具。但在使用這兩個命令過程中所發生的Oracle字符集問題,常給一些Oracle使用者帶來不必要的麻煩和不必要的數據損失。本文將就Export和Import過程中Oracle字符集的轉換規律及使用這兩個命令的注意事項做一總結。
字符集轉換的原因
Export、Import過程如上圖所示,從這個示意圖中可以看到有四處關系到字符集,而這四處字符集的不一致恰恰是導致Oracle進行字符集轉換的原因。
* 源數據庫字符集;
* Export過程中用戶會話字符集;
* Import過程中用戶會話字符集;
* 目標數據庫字符集。
在Export和Import過程中,如果存在影響字符集轉換的四因素不一致,則可能發生Oracle字符集轉換,即:
在Export過程中,如果源數據庫字符集與Export用戶會話字符集不一致,會發生字符集轉換,並在導出的二進制格式Dmp文件的頭部幾個字節中存儲Export用戶會話字符集的ID號。在這個轉換過程中可能發生數據的丟失。
例1: 如果源數據庫使用ZHS16GBK,而Export用戶會話字符集使用US7ASCII,由於ZHS16GBK是8位字符集,而US7ASCII是7位字符集,這個轉換過程中,中文字符在US7ASCII中不能夠找到對等的字符,所以所有中文字符都會丟失而變成“?? ”形式,即這種轉換後生成的Dmp文件已經發生了數據丟失。
例2: 如果源數據庫使用ZHS16GBK,而Export用戶會話字符集使用ZHS16CGB231280,但由於ZHS16GBK字符集是ZHS16CGB231280字符集的超集,這個過程中絕大部分字符都能夠正確轉換,只有一些超出ZHS16CGB231280字符集的字符變為“?? ”形式。如果源數據庫使用ZHS16CGB231280字符集,而Export用戶會話使用ZHS16GBK字符集,則轉換過程能夠完全轉換成功。