許多人可能會有這樣的經驗:明明全部系統都以 UTF-8 設置,但是用 phpMyAdmin 去看資料庫時,發現中文字仍然是亂碼。
若有發生這種情況,是因為雖然 mysql 本身及網頁都是 utf-8, 但是 xoops 卻用
latin1 將數據傳給 mysql,因此最後是 utf-8 數據被以
latin1 的格式儲存進資料庫。其實在 xoops 來看沒有任何問題,只是用 phpMyAdmin 看時,就都是亂碼,較不好管理。
以下是環境:
mysql: 5.1.22
mysql 文字編碼: utf-8 unicode
mysql 連線校對: utf-8_unicode_ci
所有資料庫都以 utf-8 建立。
phpMyAdmin: 2.11.3 (Language 選 「中文 - Chinese Traditional」)
xoops 2.0.17.1
對於這種狀況,解決的幾個面向:
1. mysql 設定:
/etc/my.cnf (或 Windows 下的 my.ini) 要有以下設定:
[client]
default-character-set=
utf8
[mysqld]
default-character-set=
utf8
init_connect='SET NAMES
utf8'
2. 在 xoops 端,先前已有各位前輩在
http://xoops.org.cn 告知大家要在
xoops/class/database/mysqldatabase.php 加入以下這行:
@mysql_query("SET NAMES '
utf8'", $this->conn);
(加此行在 $result = mysql_query($sql, $this->conn); 之前)
就可以強制用
utf8 傳輸。
3. mySQL 資料庫:
可是若有舊的 database 怎麼辦? 照上面的方法改了之後,邁入 xoops 後以前所有的中文字都變亂碼了,新輸入或重新輸入的中文字才會變正常顯示。
沒關係,照以下的步驟,就能將以前的資料庫
轉碼了:
先採以下方法將資料庫 dump 出:
mysqldump --all-databases --default-character-set=
latin1 -u root -p > dump.sql
修改 dump.sql 文件首頁的:
/*!40101 SET NAMES
latin1 */;
成為
/*!40101 SET NAMES
utf8 */;
然後再將資料庫 import 回即可:
mysql -u root -p < dump.sql
重新打開 xoops 看,中文一切 OK。進入 phpMyAdmin 看,也都沒有亂碼了。
Have a nice day!