11.05
最近在工作上常常遇到一些以前古人建立的資料庫編碼混亂的問題,通常都發生在 MySQL 資料庫新舊轉換上面。 MySQL 預設的語系是 latin1 ,但是以現在的情況而言,非英語系國家最適合的當然是 utf8 。
通常我喜歡用 phpMyAdmin 來倒出資料庫和還原,但是如果語系(編碼)沒設定好,那在 phpMyAdmin 裡面不管怎麼弄都會變成亂碼。這時候我們可以靠 mysqldump 指令來解決。
語法如下:
mysqldump -u USERNAME -pPASSWORD [DBname] > [filepath/filename.sql]
注意,-p後面緊接著密碼,不需要空格,其餘進階用法請 man mysqldump 。如果有編碼混亂的情況,可以先試著用:
mysqldump -u USERNAME -pPASSWORD --default-character-set=latin1 [DBname] > [filepath/filename.sql]
把資料倒出來看看,再用文字編輯器(Notepad++)開啟,如果沒有變成亂碼的話,即可把
CREATE TABLE `table` (
略
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
的 latin1 都取代為 utf8 ,請且重新儲存為 utf8 編碼的檔案(無BOM),這樣就是一個 utf8 的完整 dump 檔了!
除了修改資料庫的連線問題之外,也可以修改 my.cnf
[mysqld] default-character-set=utf8 [client] default-character-set=utf8 init_connect='SET NAMES utf8'
其中[mysqld]的設定內容修改為 utf8 ,可以把資料庫預設的編碼從 latin1 改為 utf8 ,至於 client 的內容則是預設的查詢條件。要不要改就看個人意願了(我個人偏好不做修改,而是從程式那邊的查詢下手)。
舉例而言,稍據規模的專案,幾乎都有 DB 的 Driver 可找,通常 Driver 內都有一個部份在做 prefetch ,在該區加入
mysql_query("SET NAMES 'UTF8'");
這樣感覺就好多了!出來的文字編碼也不會錯了!當然,如果以後要再用 mysqldump 備份的話,記得指令要打完整
mysqldump -u USERNAME =pPASSWORD --default-character-set=utf8 [DBname] > [filepath/filename.sql]
以防倒出來的編碼不小心又錯了。

[...] 资料参考:http://blog.roga.tw/2008/11/05/1127 [...]
Thanks