2008
11.05

mysqldump 的一些注意事項

最近在工作上常常遇到一些以前古人建立的資料庫編碼混亂的問題,通常都發生在 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]

以防倒出來的編碼不小心又錯了。

3 comments so far

Add Your Comment
  1. :D 感謝分享

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

  3. Thanks

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>