Illegal mix of collations (gbk_chinese_ci,IMPLICIT)
and (gbk_bin,IMPLICIT) for Operation '='
SQL State: HY000, Error Code: 1267
資料庫預設字符集(Collation)與建表時指定的字符集不一致。常見於:安裝 MySQL 時設定為 gbk,但建表語句未顯式指定 CHARSET,導致表繼承預設值,而欄位層級又被隱式或顯式設定為 gbk_bin,比較運算時 Collation 衝突。
CREATE TABLE `teachers` (
`id` INT(11) NOT NULL DEFAULT '0',
`name` VARCHAR(20) DEFAULT NULL,
`password` VARCHAR(20) DEFAULT NULL,
`department_id` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
DEFAULT CHARSET=gbk 強制表層級字符集,欄位若無額外指定將繼承此設定,避免隱式衝突。
CREATE TABLE `teachers` (
`id` INT(11) NOT NULL DEFAULT '0',
`name` VARCHAR(20) DEFAULT NULL,
`password` VARCHAR(20) DEFAULT NULL,
`department_id` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
前提是資料庫建立時已正確設定 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci,且所有連線參數(character_set_client、connection、results)一致。
| 層級 | 配置位置 | 建議值(中文環境) |
|---|---|---|
| 伺服器 | my.cnf [mysqld] | character-set-server=utf8mb4collation-server=utf8mb4_unicode_ci |
| 資料庫 | CREATE DATABASE ... DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; | 同上 |
| 資料表 | CREATE TABLE ... DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; | 同上 |
| 欄位 | col VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci | 僅在特殊需求時覆寫 |
| 連線 | 應用程式連線字串 / SET NAMES utf8mb4; | utf8mb4 |
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW CREATE DATABASE db_name;
SHOW CREATE TABLE tbl_name;
字符集問題 90% 來自「隱式繼承不一致」。建立資料庫、資料表、欄位時顯式宣告 CHARSET/COLLATE,並在 my.cnf 統一伺服器預設值,配合應用層 SET NAMES utf8mb4,即可徹底杜絕 Error 1267。新專案強烈建議直接採用 utf8mb4,完整支援 Emoji 與生僻字。