記一次Oracle資料遷移中文亂碼問題
背景:公司打算將專案遷移到阿里雲,從原來的伺服器Oracle資料庫匯出資料然後匯入到本地伺服器的Oracle資料庫中,作為中轉站,阿里雲Oracle資料庫安裝完後再從本地資料庫匯出資料匯入到阿里雲中,匯入阿里雲後發現數據庫中文亂碼,一下便是處理資料庫中文亂碼的操作流程。(已知本地資料庫無亂碼)
一、檢視本地Oracle資料庫字符集
SQL:
select userenv('language') from dual;
可以發現Oracle資料庫的字符集是 SIMPLIFIED CHINESE_CHINA.AL32UTF8
那麼接下來就是要檢視阿里雲(客戶端)的字元集了
二、檢視阿里雲客戶端字符集
命令:locale
這裡我們檢視LANG的值就行了,為 zh_CN.UTF-8
三、檢視zh_CN.UTF-8對應的字符集
我們可以看到對應的NLS_LANG字符集為 SIMPLIFIED CHINESE_CHINA.AL32UTF8
關於NLS_LANG:當我們設定一種nls的時候實際上我們是為oracle在存放資料時指定了他的語種所特有的一些表達形式,比如我們選擇chinese,那麼它的中文字元如何存放,按什麼規則排序,貨幣如何表示,日期格式也就被設定了。
四、設定NLS_LANG的值
由上面已知,NLS_Lang的值決定著Oracle資料庫存放資料的方式,這裡恰好和本地資料庫查出來的是一致的,如果不一致則以本地資料庫的字符集為基準,對應的LANG、NLS_LANG也必須修改。
切換到Oracle使用者:
su - oracle
echo $NLS_LANG
如果不是 SIMPLIFIED CHINESE_CHINA.AL32UTF8 則需要修改.bash_profile,一勞永逸
vi .bash_profile
修改NLS_LANG值 為 SIMPLIFIED CHINESE_CHINA.AL32UTF8
:wq #存檔退出
使.bash_profile檔案生效
source .bash_profile
如果提示報錯,請檢查.bash_profile中ORA_NLS10的值
五、刪除之前建立的Oracle使用者及表空間
需要注意的是,你匯入資料後再修改字符集是沒用的,因為你匯入時中文儲存的方式就是你修改NLS_LANG的值的方式,所以需要將之前匯入的資料清除,最好是清楚使用者和表空間。
匯入資料的許可權問題請自行百度賦予使用者有相應的許可權
最後再匯入資料到阿里雲Oracle資料庫後查詢測試發現中文可以正常顯示。
以上便是本次資料遷移發生的中文亂碼的原因及處理方法。
六、總結
通過本次經歷,意識到資料遷移必須先檢測雙方的環境是否一致(資料庫版本、字符集),一致方可進行遷移。
另外,資料遷移過程中資料丟失如何處理(比如丟失表)? 造成資料丟失的原因是什麼?如何預處理?還有待思考!
參考文章: