萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

解決 MySQL Illegal mix of collations (latin1_swedish_ci, utf8_general_ci) 混排規則衝突

錯誤現象

java.sql.SQLException: Illegal mix of collations 
(latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

原因:同一 SQL 中涉及的列/常量/變量擁有不同排序規則,MySQL 無法隱式轉換。

排查步驟

SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

典型輸出顯示:character_set_database=latin1、collation_database=latin1_swedish_ci,而連接層為 utf8。

臨時會話級修復(立即生效)

SET character_set_database = utf8;
SET character_set_results = utf8;
SET character_set_server = utf8;
SET character_set_system = utf8;
SET collation_server = utf8_general_ci;
SET collation_database = utf8_general_ci;

永久配置修復

Windows (my.ini)

[mysql]
default-character-set=utf8

[mysqld]
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

Linux (/etc/my.cnf)

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

修改後 重啟 MySQL,僅對新建庫/表生效。

存量對象修正(庫/表/列級)

-- 庫
ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- 表
ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- 列
ALTER TABLE `test` CHANGE `dd` `dd` VARCHAR(45) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;

客戶端連接指定編碼

mysql --default-character-set=utf8 -u root -p
-- 或 JDBC URL
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8
-- PHP PDO
new PDO("mysql:host=...;dbname=...;charset=utf8", ...)

驗證最終狀態

SHOW VARIABLES LIKE 'character_set_%';
-- 關鍵項均為 utf8
SHOW VARIABLES LIKE 'collation_%';
-- 關鍵項均為 utf8_general_ci

避坑總結

  1. 新項目一律 utf8mb4 + utf8mb4_general_ci(或 0900_ai_ci)。
  2. 應用層連接字符串顯式指定 charset。
  3. 避免混用 latin1 與 utf8 的表/列參與同一查詢。
copyright © 萬盛學電腦網 all rights reserved