MySQL 5 使用 UTF-8 配合 WordPress 的問題
果然「Ignorance is a bliss」。不知道、不清楚、不明白、不去碰它,就不會有問題。一研究,才發現原來問題那麼多。這邊先筆記以下,改天繼續。
MySQL 編碼方面
目前發現 MySQL 5.0.11-beta 裡用的都是 latin1。目前心得是依照這個步驟改:
- 用 mysqldump -default-character-set=latin1 來備份所有資料庫(確認過用這個丟出來的檔案,可以直接用 Vim 與 EmEditor 當成 UTF-8 開啟,中文都正常顯示)
- 把各資料庫刪除(也就是 WordPress……當然系統方面的東西不碰他)
- 把備份資料庫丟回去
不過不確定可行,所以還沒做。最終目標是全 UTF-8 的資料庫後端,所以還得改 my.cnf──但是我就是找不到這個檔案在哪裡呀!
MySQL 編碼問題更新
終於完成了(我用 FreeBSD 5.3 + MySQL 5)。問題簡單來說,就是 MySQL 預設內部是用 latin1 處理資料,所以外表看似 UTF-8 的 WordPress 站實際資料卻並非純正 UTF-8。用 mysqldump 看就會發現全都是亂碼,直接在 mysql 裡 SELECT 出來的也全是亂碼。
- 先進 mysql 看編碼:
mysql> show variables like '%character%';
,都是 latin1 的話就要改 - 備份 WordPress:
mysqldump -u root -p --default-character-set=latin1 --add-drop-table 資料庫名稱 > 備份檔名稱
- 把資料庫編碼改過:
mysql> ALTER DATABASE DEFAULT CHARACTER SET utf8;
- 修改 ,加入:
[mysqld]
default-character-set=utf8
[mysql]
default-character-set=utf8
- 重新啟動 MySQL:
/usr/local/etc/rc.d/mysql-server.sh restart
- 先備份一份剛才的資料庫備份檔,然後手動編輯把裡面的 latin1 改成 utf8;一個是最開頭的「SET NAMES latin1」,再來就是建立每個表格時的「ENGINE=MyISAM DEFAULT CHARSET=utf8;」
- 改好之後把資料庫送回去:
mysql -u root -p 資料庫名稱 < 改過的備份檔案名稱
- 最後,如果是用 root 或其他 SUPER 權限帳戶存取 MySQL 的話,還得修一下 WordPress 的 wp-includes/wp-db.php,在連接資料庫後自己 set names:搜尋 然後在前一行加入
mysql_query("SET NAMES 'UTF8'");
即可。( clsung 說:「 具有 SUPER 權限的人,加在 my.cnf 是沒用的 。」我想大概只要另外給一個使用者供 WordPress 專用,就不用修 wp-db.php 了吧……話說回來,只因為懶得研究如何新增使用者、授予權限,就讓 WordPress 一直用 root 去連 MySQL,我也實在是太沒警戒心了。) - 如果出問題,可以從備份還原:
mysql -u root -p 資料庫名稱 < 備份檔名稱
如此就大功告成了,從裡到外每一環節都是 UTF-8,在 mysql 裡直接 SELECT 出來的也都是正確的 UTF-8 中文了。總共兩天的時間,加起來花了好幾個小時,雖然有點累,但也成果豐碩,學了不少東西。這種滿足感,可是玩 Windows 很少有的。