昨天發現 WordPress 模板根目錄下的 error.log 文件竟然有 300M 之巨。 error.log 這個文件是專門用來記錄 web 服務器訪問錯誤的,如果一旦出現異常,它就會迅速記錄下來,所以文件大小會突然增長很快。

打開文件後,看到錯誤日誌記錄如下:

[21-Apr-2013 05:44:07] WordPress 數據庫查詢
SELECT * FROM wpcourse_prli_links WHERE
slug='awesome-flickr-gallery 插件推薦.html' 時發生 Illegal mix of collations
(latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for
operation '=' 錯誤,這是由 require('wp-blog-header.php'),
require_once('wp-load.php'), require_once('wp-config.php'),
require_once('wp-settings.php'), do_action('init'),
call_user_func_array, prli_redirect, prli_link_redirect_from_slug,
PrliLink->getOneFromSlug, dbrc_wpdb->query,
dbrc_wpdb->dbcr_query 查詢的。

[21-Apr-2013 05:44:07] WordPress 數據庫查詢
SELECT slug FROM wpcourse_prli_links WHERE slug like
'awesome-flickr-gallery 插件推薦.html/%' 時發生 Illegal mix of collations
(latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for
operation 'like' 錯誤,這是由 require('wp-blog-header.php'),
require_once('wp-load.php'), require_once('wp-config.php'),
require_once('wp-settings.php'), do_action('init'),
call_user_func_array, prli_redirect, dbrc_wpdb->query,
dbrc_wpdb->dbcr_query 查詢的。

經分析,其中其實已經把問題寫得比較明白了,錯誤名稱就叫 Illegal mix of
collations,指的是在執行一段 SQL 數據庫操作的時候,數據庫的編碼跟要查詢文字的編碼不匹配。其中一個是
latin1_swedish_ci,另一個是 utf8_general_ci 。

而產生這個錯誤的表就是 prli_link 這個表。後來一查,發現這個表是一個叫 pretty link 的插件引起的。後面在 phpmyadmin 裏手工把這個表的編碼從 latin1_swedish_ci 轉成了 utf8_general_ci,錯誤就再也沒發生過。

這裏要提醒大家的是,由於很多 WordPress 插件都是老外編寫的,所以有個別的插件很可能沒有考慮到編碼的問題,他們很多都是用的西方文字編碼,所以有可能在中文博客上發生錯誤。

在 WordPress 根目錄下的 error.log 文件應該經常看一下,否則可能後果很嚴重。