Illegal mix of collations (gbk_chinese_ci,IMPLICIT)
and (gbk_bin,IMPLICIT) for Operation '='
SQL State: HY000, Error Code: 1267
經典場景:資料庫預設 gbk_chinese_ci,但某資料表或欄位被建立為 gbk_bin,JOIN 或 WHERE 比較時引發衝突。
_bin (二進位比較) vs _ci (大小寫不敏感) 屬於不同 Collation 家族,MySQL 5.1+ 拒絕隱式轉換。SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA='your_db';
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='your_db' AND TABLE_NAME='your_table';
-- 修改資料庫預設
ALTER DATABASE your_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- 修改資料表預設 (僅影響新增欄位)
ALTER TABLE your_table CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- 修改現有欄位 (需逐欄位轉換數據)
ALTER TABLE your_table
CHANGE col_name col_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
注意:大表轉換會鎖表,建議使用 pt-online-schema-change 或維護窗口操作。
-- 查詢層級強制指定
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id COLLATE utf8mb4_unicode_ci;
-- 或連線層級設定
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
my.cnf 強制 character-set-server=utf8mb4、collation-server=utf8mb4_unicode_ci、skip-character-set-client-handshake。CREATE TABLE 必須顯式帶 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci。SHOW SESSION VARIABLES LIKE 'character_set%' 確保一致。字符集衝突本質是「編碼契約不一致」。統一全鏈路為 utf8mb4 + utf8mb4_unicode_ci,並在配置、建表、連線三環節加鎖,即可一次性根治 1267 錯誤,同時完美支援 Emoji 與多語言。