資料庫轉移latin1與utf8的困擾

這幾天抽空配合網路中心的伺服器更新措施,搬遷了台中縣國教輔導團的gallery平台

其中在資料庫的轉移部分遇到了些小小的問題,作一下筆記

其實在很多平台、服務進行轉移的時候也都會有類似的問題

通常比較早以前建置的服務,因為套裝程式沒有考慮到或者因為資料庫伺服器版本太舊等等因素

經常會出現MySQL資料庫編碼預設為 latin1 ( latin1_swedish_ci ) 但是其實 php 寫入的資料卻是 UTF8

通常,這種怪現象在剛安裝的平台上並不會產生什麼錯誤,不過,當要轉移的時候肯定要與亂碼搏鬥一番

以下是今天的解決方法,作個筆記,以後應該還用得上

  1. mysqldump -u user -p 資料庫 > example.sql --default-character-set=latin1
  2. 用vim的字串取代功能把sql中的charset=latin1 取代為 utf8
  3. mysql 資料庫 < example.sql -u user -p --default-character-set=utf8

第一個步驟將資料用正確的編碼讀取出來,接著修改重新匯入create table的default charset

雖然我是用vim的來作取代,其實用notepad++之類,有支援UTF8的編輯器其實都可以

只是因為資料庫dump出來之後往往動輒數十到數百MB,如果在pc上面跑編輯器,很有可能會掛點 XD


使用vim字串取代的方式

:n1,n2s/word1/word2/g

  • 在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串取代為 word2 !

:1,$s/word1/word2/g

  • 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !

:1,$s/word1/word2/gc

  • 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !且在取代前顯示提示字元給使用者確認(conform)是否需要取代!

vim指令可以參考「鳥哥的私房菜


如果在很理想的狀況下,這樣應該就解決了,不過,通常老天爺沒有這麼感心 @@

有時候還是有可能會出現亂碼,或者匯入的時候失敗,等等奇奇怪怪的結果

可以針對匯入的時候那個錯誤訊息,去看看是哪個資料表出了問題,手動在做彌補

如果要匯出單一個資料表,且想用phpMyAdmin看到那個怪怪的latin1格式的utf8資料顯示正確文字

可以先找到 phpMyAdmin中的libraries目錄,編輯其下的 select_lang.lib.php

找到

$GLOBALS['mysql_charset_map'] = array(

... 略

'utf-8' => 'utf8'

... 略

);

將其中的 'utf-8' => 'utf8' 暫時改為 'utf-8' => 'latin1'

這樣一來,就可以在phpMyAdmin中正常顯示中文字,趕快使用輸出的功能將資料表匯出為sql

再到新的server去做匯入就可以了。

留言