2006-10-10

轉碼的感動

Mysql自從推出4.1版之後,網路上常常聽的到轉換的慘叫聲。因為有先見之明,所以我先行把資料庫備份起來,再開始所謂的轉碼的大工程(謎之聲:俗話說,有備無患!好句好句)。

從Google(註1)上查到的資料顯示,不管是用phpMyadmin或是使用apples所寫的資料庫轉換程式,得到的結果都是亂碼(註2)。因為我不信邪,所以以上兩種方法我都試過請不要再試了。正確的方法是使用mysql的程式mysqldump,然後把dump出來的資料做簡單的編輯,再丟回資料庫即可。


  1. 找到mysqldump程式的位置並且執行:
    mysqldump database > database.sql --default-character-set=latin1 -u abc -p

    • -u 設定要使用的帳號

    • abc 使用帳號名稱,通常是使用root或是有權限的帳號

    • -p 要輸入密碼

    • database 要輸出的資料庫名稱

    • database.sql 輸出的資料庫存方檔案

    • --default-character-set=latin1 設定讀出的編碼(根據自己的mysql編碼而設)


  2. 把datapase.sql這個檔案用Emeditor來編輯,把裡面的latin1全部用utf8換過。然後再另存新檔,並且記得用UTF-8來存(建議不要用本來的檔名,另設一個database_utf8.sql更好)。

  3. 把剛剛處理過的database_utf8.sql再傳回Mysql
    mysql database < database_utf8.sql --default-character-set=utf8 -u abc -p

    • 可以在傳入前把mysql的編碼換成utf-8,或是把mysql升級





運氣好的話照著以上的步驟若沒有出現錯誤的話,轉碼就成功了!但是,我在處理Mediawiki的資料庫的時候遇到了這樣的問題…
Specified key was too long; max key length is 1000 bytes
我試著改結構表, 但是不可行錯誤依舊存在。後來我才在這篇文章發現,原來我把Innodb也給丟出來了(囧)。我對著我有問題的那個資料表把ENGINE=MyISAM換成ENGINE=InnoDB, 就可以正常匯入!

然後進到phpMyAdmin裡面看資料庫,是中文!感動的無法言語 :'(

latin1 to utf-8

我是一直卡在編輯資料庫的檔案上,本來是試著用vim加上encoding去更改內容。不管我怎麼試好像都是錯的,可能是vim不能完全支援utf-8吧 :(
我後來我才發現,編輯檔案的工作交給Emeditor就可以了,畢竟這個是日本人所寫的程式阿。

註1. 我使用的關鍵字為「mysql utf8」或「mysql utf-8」

註2. 我連接進mysql的時候是使用utf-8,phpMyAdmin裡面顯示的校正也是utf-8,只有在系統編碼的地方才是latin1。


相關網頁:

0 comments: