Error: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gbk_chinese_ci,COERCIBLE) for operation '=' Errno: 1267
這是典型的字符集校對規則衝突:SQL 語句中涉及的兩個字符串(或列、參數)分別屬於 utf8_general_ci 和 gbk_chinese_ci 校對規則,MySQL 無法隱式轉換比較。
collation_connection。在應用連接池配置或連接初始化時,顯式執行以下命令,強制統一會話級字符集:
SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; -- 等價於以下組合: SET character_set_client = utf8mb4; SET character_set_connection = utf8mb4; SET character_set_results = utf8mb4; SET collation_connection = utf8mb4_general_ci;
建議: 統一使用 utf8mb4 (支援 Emoji、完整 Unicode) 而非老旧的 utf8 (實為 utf8mb3)。
若歷史表已為 gbk,需轉換為 utf8mb4:
-- 1. 修改表默認字符集 (僅影響新增列) ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 2. 轉換現有列數據 (關鍵步驟,會重建表) ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 3. 單獨修改某列 ALTER TABLE tbl_name MODIFY col_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 在 WHERE/JOIN/比較處強制轉換 SELECT * FROM t1 JOIN t2 ON t1.col = CONVERT(t2.col USING utf8mb4); -- 或指定校對規則 SELECT * FROM t WHERE col = '中文' COLLATE utf8mb4_general_ci;
my.cnf 設置 character-set-server=utf8mb4, collation-server=utf8mb4_general_ci。CREATE TABLE ... DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci。?characterEncoding=utf8&connectionCollation=utf8mb4_general_ci;Python/MySQLdb 連接參數 charset='utf8mb4';Go sqlx SET NAMES utf8mb4。