一、問題:這個是因為導出端的數據庫編碼和導入端的數據庫編碼不一致,我得導出端a是ZHS16GBKUNIX這種編碼格式,而導入端b的是AL32UTF8這種編碼格式,從而如果從a導出dmp文件,再導入到b端數據庫時,會報錯出編碼不一致,數據不能完整的導入進去
二、分析:使用exp命令導出的dmp文件的編碼會受到兩個原因影響,一個是a端數據庫的編碼,查詢sql:
SELECT * FROM NLS_DATABASE_PARAMETERS;
這個會影響導出dmp文件的數據內容,另一個是a端的系統編碼,即系統變量中的NLS_LANG參數值影響,如果NLS_LANG為空,那么導出的文件編碼會默認為數據庫的編碼,設置NLS_LANG值方法:
1.windows中,一次性設置,即在導入的窗口中直接設置
set NLS_LANG=american_america.AL32UTF8
2.windows中,直接設置環境變量:添加系統的(非某個用戶)環境變量
NLS_LANG=american_america.AL32UTF8
3.windows中,修改注冊表:Oracle的NLS_LANG為american_america.AL32UTF8
;
使用imp導入時,目標dmp文件的編碼會影響導入結果,這樣就需要設置b端的系統編碼,同上;
而數據庫的編碼不能夠輕易去改,要不會將已有的數據丟失,這里也會有一個問題,不同的數據庫編碼,會對字符(特指中文)的字段長度定義不一致,導入的時候會出現有的記錄因字段過長而不能導入,這是正常的(解決辦法:修改字段長度,重新導出導入);
三:辦法:同分析中的解決辦法一致,具體哪種方法,自己斟酌,