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

MySQL 日期比較報錯:Illegal mix of collations 字符集衝突解決

     編輯:MySQL 資料庫相關知識

錯誤現場

SELECT DATE_FORMAT('2013-11-19', '%Y-%m-%d') > TIMEDIFF('2013-11-19', '2013-11-20');

ERROR 1267 (HY000): Illegal mix of collations 
(utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC) for operation '>'

根因:函數返回值字符集屬性不同

函數返回類型字符集屬性受什麼影響
DATE_FORMATVARCHAR有字符集/校對集character_set_connection, collation_connection
TIMEDIFFTIME二進制 (binary)無字符集屬性

驗證實驗

SET NAMES utf8;
SELECT CHARSET(DATE_FORMAT('2013-11-19', '%Y-%m-%d')), 
       CHARSET(TIMEDIFF('2013-11-19', '2013-11-20'));
-- 結果:utf8 | binary

SET NAMES gb2312;
SELECT CHARSET(DATE_FORMAT('2013-11-19', '%Y-%m-%d')), 
       CHARSET(TIMEDIFF('2013-11-19', '2013-11-20'));
-- 結果:gb2312 | binary

DATE_FORMAT 字符集隨連接字符集變化,TIMEDIFF 恒為 binary。

解決方案:顯式字符集轉換

SELECT DATE_FORMAT('2013-11-19', '%Y-%m-%d') 
       > CONVERT(TIMEDIFF('2013-11-19', '2013-11-20') USING utf8);
-- 正常返回 1

更多轉換示例

-- CAST 轉換(同 CONVERT)
SELECT DATE_FORMAT(dt, '%Y-%m-%d') > CAST(TIMEDIFF(dt1, dt2) AS CHAR CHARACTER SET utf8);

-- 統一轉 binary(最通用)
SELECT CAST(DATE_FORMAT(dt, '%Y-%m-%d') AS BINARY) > CAST(TIMEDIFF(dt1, dt2) AS BINARY);

同類易發函數對

有字符集屬性無字符集屬性
DATE_FORMATTIMEDIFF / TIMESTAMPDIFF
CONCATSUBSTRING / LEFT / RIGHT
UPPER / LOWERHEX / UNHEX
CAST(... AS CHAR)CAST(... AS BINARY)

最佳實踐

  1. ✅ 表/列/連接**統一使用 utf8mb4**,減少隱式轉換
  2. ✅ 跨函數比較時,**顯式 CAST/CONVERT 統一字符集**
  3. ✅ 避免在 WHERE/JOIN/ORDER BY 中混用不同字符集來源的表達式
  4. ✅ 使用 CHARSET() / COLLATION() 函數調試表達式字符集屬性

版本信息

測試環境:Percona Server 5.5.20-55-log (GPL), Release rel24.1, Revision 217

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