1. 程式人生 > >記一次Oracle資料遷移中文亂碼問題

記一次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資料庫後查詢測試發現中文可以正常顯示。

以上便是本次資料遷移發生的中文亂碼的原因及處理方法。

六、總結

        通過本次經歷,意識到資料遷移必須先檢測雙方的環境是否一致(資料庫版本、字符集),一致方可進行遷移。

另外,資料遷移過程中資料丟失如何處理(比如丟失表)? 造成資料丟失的原因是什麼?如何預處理?還有待思考!

參考文章: