萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 字符集錯誤「Illegal mix of collations」實戰解決:庫表編碼不一致統一至 GBK/UTF8

報錯現象

Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (gbk_bin,IMPLICIT) for operation '=' SQL State: HY000, Error Code: 1267

根因

**數據庫默認字符集與建表時指定字符集不一致**,導致列級校對規則衝突。例如庫為 gbk,表未顯式指定而繼承了 latin1 或 utf8,或列級單獨指定了 gbk_bin。

解決方案:建表時顯式指定字符集


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 確保表級、列級默認校對規則一致 (gbk_chinese_ci)。

若已建表:ALTER TABLE 轉換


-- 僅修改表默認字符集 (影響後續新增列)
ALTER TABLE `teachers` DEFAULT CHARACTER SET gbk;

-- 完整轉換現有列數據 (推薦)
ALTER TABLE `teachers` CONVERT TO CHARACTER SET gbk COLLATE gbk_chinese_ci;

數據庫級別統一字符集


CREATE DATABASE `mydb` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
-- 或修改現有庫
ALTER DATABASE `mydb` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

連接層字符集設置 (防止亂碼)


-- 客戶端連接後立即執行
SET NAMES gbk;
-- 等價於
SET character_set_client = gbk;
SET character_set_results = gbk;
SET character_set_connection = gbk;

JDBC URL 參數 (舊版驅動需顯式):
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=GBK&autoReconnect=true

驗證字符集設置


SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
-- 關鍵變量應均為 gbk / gbk_chinese_ci

現代最佳實踐:全鏈路 UTF8MB4

  • 數據庫/表/列:DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  • 連接:SET NAMES utf8mb4 / JDBC characterEncoding=utf8mb4
  • 配置文件 [mysqld]:character-set-server=utf8mb4, collation-server=utf8mb4_unicode_ci
  • 優勢:完整支持 Emoji、補充字符、排序規則更科學,避免 utf8 (實為 utf8mb3) 截斷 Bug。
copyright © 萬盛學電腦網 all rights reserved