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_FORMAT()returns a string with a character set and collation given bycharacter_set_connectionandcollation_connectionso that it can return month and weekday names containing non-ASCII characters.
而 TIMEDIFF() 返回 binary 字符集(無校驗規則)。當兩邊字符集/校驗規則不兼容且無法隱式轉換時,比較操作報錯。
mysql> SET NAMES utf8;
mysql> SELECT CHARSET(DATE_FORMAT('2013-11-19','%Y-%m-%d')), CHARSET(TIMEDIFF('2013-11-19','2013-11-20'));
+--------------------------------------------------+--------------------------------------------------+
| CHARSET(DATE_FORMAT(...)) | CHARSET(TIMEDIFF(...)) |
+--------------------------------------------------+--------------------------------------------------+
| utf8 | binary |
+--------------------------------------------------+--------------------------------------------------+
mysql> SET NAMES gb2312;
mysql> SELECT CHARSET(DATE_FORMAT('2013-11-19','%Y-%m-%d')), CHARSET(TIMEDIFF('2013-11-19','2013-11-20'));
+--------------------------------------------------+--------------------------------------------------+
| CHARSET(DATE_FORMAT(...)) | CHARSET(TIMEDIFF(...)) |
+--------------------------------------------------+--------------------------------------------------+
| gb2312 | binary |
+--------------------------------------------------+--------------------------------------------------+
結論:DATE_FORMAT 結果字符集隨 SET NAMES(即 character_set_connection)變化;TIMEDIFF 永遠是 binary。
SELECT DATE_FORMAT('2013-11-19','%Y-%m-%d') > CONVERT(TIMEDIFF('2013-11-19','2013-11-20') USING utf8);
返回 1,正常工作。
SET NAMES binary;
-- 之後 DATE_FORMAT 也返回 binary,不再衝突
-- 將日期格式化為數字比較
SELECT CAST(DATE_FORMAT('2013-11-19','%Y%m%d') AS UNSIGNED) >
CAST(DATE_FORMAT('2013-11-20','%Y%m%d') AS UNSIGNED);
SET NAMES utf8mb4),避免隱式轉換驚喜。DATE_FORMAT、CONCAT 等返回字符串的函數與 binary 類型(TIMEDIFF、SUBSTRING 等)混用比較時,顯式 CONVERT(... USING charset)。utf8mb4,表/列級別不再單獨指定,減少 COERCIBLE 推導複雜度。