Oracle 在進行dmp備份和還原的時候,服務器端字符集和客戶端字符集會對這個過程有較大影響,特別是數據表中存儲了中文、存儲過程當中使用了中文編碼(註釋)的時候,若是沒有處理好字符集的問題,在進行還原的時候就會遇到問題,我所遇到過的問題有一下幾種:sql
1:導入後數據表中存儲的中文字符成了亂碼;數據庫
2:導入後存儲過程當中的中文字符成了亂碼;服務器
3:導入時,提示某些存儲過程不存在,報IMP-00098 INTERNAL ERROR:impccr2錯誤:編碼
其中問題1出現的緣由是源數據庫使用的字符集和你如今導入的目標數據庫字符集不一致,且目標數據庫字符集不是源數據庫字符集的超集。解決辦法是修改目標數據庫的字符集(這個字符集是在建立數據庫實例的時候設置的),改爲和源數據庫一致,再執行導入操做,能夠解決數據表中中文字符亂碼問題。spa
問題2和問題3的解決辦法,修改客戶端字符集,檢查你的系統環境變量NLS_LANG的值或者註冊表HKEY_LOCAL_MACHINE-->SOFTWARE-->ORACLE 在這個分支下面找NLS_LANG鍵,修改這個鍵值再從新導入數據便可。server
最後咱們須要知道字符集應該改爲什麼?blog
方法一:去源數據庫上查詢 變量
須要用到的視圖: nls_database_parameters、props$、v$nls_parameterscli
方法二:查看導入的時候sqlplus中的提示信息:亂碼
最後一行能夠看到,export client uses ....也就是說導出客戶端使用的字符集是ZHS16GBK,並且根據當前的設置,是有可能進行字符集的轉換(也就意味着有可能出現亂碼,若是如今用的字符集不是導出字符集的超集)。因此這裏就用該把導入數據庫客戶端字符集設置成ZHS16GBK,再執行導入能夠解決問題。
網上有些辦法是修改dmp文件,我的認爲,若是是目標數據庫端字符集不知足要求,能夠採用這種方法修改dmp文件,畢竟server端字符集不能隨便更改(生產server一個實例下可能有多個應用系統的用戶數據)。若是是客戶端字符集問題,建議仍是修改一下客戶端字符集配置,等導入完成以後再把客戶端字符集修改回來。