應用層執行含中文條件的 SQL 時拋出 Error 1267: Illegal mix of collations (gbk_bin,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='。根因是列字符集與字符串字面量字符集不一致,MySQL 無法隱式轉換導致比較失敗。
SELECT t.EVENT_TYPE_ID FROM RATABLE_EVENT_TYPE t WHERE t.NAME = '帳期末費用轉移事件'; -- 報錯:mix of collations (gbk_bin,IMPLICIT) and (latin1_swedish_ci,COERCIBLE)
t.NAME 列字符集為 gbk,校對規則 gbk_bin(IMPLICIT:列隱式字符集)'帳期末費用轉移事件' 在當前連接字符集下被解釋為 latin1(COERCIBLE:可強制轉換)latin1 字面量隱式轉為 gbk 比較,但 latin1 無法表示中文,導致「非法混合」SELECT t.EVENT_TYPE_ID FROM RATABLE_EVENT_TYPE t WHERE t.NAME = BINARY '帳期末費用轉移事件';
BINARY 強制字面量視為二進制字節流,繞過字符集轉換,直接按字節比較。
WHERE t.NAME = _gbk '帳期末費用轉移事件'
-- 或
WHERE t.NAME = CONVERT('帳期末費用轉移事件' USING gbk)
-- 連接建立後立即執行 SET NAMES gbk; -- 或 utf8mb4,需與列字符集一致
SHOW CREATE TABLE tbl 確認列字符集/校對規則SHOW VARIABLES LIKE 'character_set%' 確認連接層 client/connection/resultscharacterEncoding/connectionCollation?characterEncoding=gbk&connectionCollation=gbk_binSET NAMES utf8mb4hibernate.connection.characterEncoding / spring.datasource.connectionInitSqls