在開發 PHP 應用連接 MySQL 時,經常會遇到 Illegal mix of collations 錯誤。這類錯誤通常發生在字符集比較操作中,例如當查詢條件包含中文字符時。本文詳細記錄一次實戰排查過程,幫助開發者快速定位並解決字符集不一致問題。
執行簡單的查詢語句:
<?php
$connection = mysql_connect("localhost", "root", "password");
mysql_select_db("test", $connection);
$query = "select * from users where name='你好'";
$result = mysql_query($query, $connection);
while($row = mysql_fetch_array($result)) {
echo "用戶ID:" . $row[0] . "<br>";
echo "用戶名:" . $row[1] . "<br>";
}
?>
報錯信息:
Error: Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='
核心原因:比較操作符兩側字符集不同,一邊是 gbk_chinese_ci,另一邊是 latin1_swedish_ci。
執行 SHOW VARIABLES LIKE "%char%"; 和 SHOW VARIABLES LIKE "%coll%"; 查看當前設置:
| 變量名 | 值 |
|---|---|
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_results | utf8 |
| character_set_server | utf8 |
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | utf8_general_ci |
發現 數據庫層面仍使用 latin1,而連接層使用 utf8,這就是衝突源頭。
執行以下命令將數據庫字符集修改為 utf8:
mysql> SET character_set_database = utf8;
mysql> SET collation_database = utf8_general_ci;
修改後重新驗證,確認 character_set_database 和 collation_database 均已變為 utf8 相關值。
utf8_bin:二進制比較,區分大小寫utf8_general_ci:通用比較,不區分大小寫,速度較快utf8_unicode_ci:Unicode 標準比較,準確度高但稍慢兼容性結論:
utf8mb4(支援完整 Unicode)my.cnf 中明確設置 character-set-server=utf8mb4 和 collation-server=utf8mb4_unicode_ciDEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ciSET NAMES utf8mb4 確保通信字符集一致遵循「全鏈路統一字符集」原則,可從根源避免此類編碼衝突。