首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

解決 MySQL「Illegal mix of collations」字符集衝突錯誤

     編輯:MySQL 資料庫相關知識

在開發 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。

排查步驟

1. 檢查數據庫字符集配置

執行 SHOW VARIABLES LIKE "%char%"; 和 SHOW VARIABLES LIKE "%coll%"; 查看當前設置:

變量名值
character_set_clientutf8
character_set_connectionutf8
character_set_databaselatin1
character_set_resultsutf8
character_set_serverutf8
collation_connectionutf8_general_ci
collation_databaselatin1_swedish_ci
collation_serverutf8_general_ci

發現 數據庫層面仍使用 latin1,而連接層使用 utf8,這就是衝突源頭。

2. 統一字符集設置

執行以下命令將數據庫字符集修改為 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 標準比較,準確度高但稍慢

兼容性結論:

  • utf8_bin 與 utf8_general_ci 可混用
  • utf8_bin 與 utf8_unicode_ci 可混用
  • utf8_general_ci 與 utf8_unicode_ci 不可混用

最佳實踐建議

  1. 安裝 MySQL 時統一指定字符集為 utf8mb4(支援完整 Unicode)
  2. 配置文件 my.cnf 中明確設置 character-set-server=utf8mb4 和 collation-server=utf8mb4_unicode_ci
  3. 建表時顯式指定 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  4. 連接建立後執行 SET NAMES utf8mb4 確保通信字符集一致

遵循「全鏈路統一字符集」原則,可從根源避免此類編碼衝突。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved