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;
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
[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
utf8mb4 + utf8mb4_general_ci(或 0900_ai_ci)。latin1 與 utf8 的表/列參與同一查詢。