首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 字符集衝突錯誤 1267 解決方案:統一資料庫與建表編碼

     編輯:MySQL 資料庫相關知識

錯誤現象

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=utf8mb4
collation-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 與生僻字。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved