MySQL中DATE_FORMAT结果与字符串、数字的比较规则疑问
MySQL字符串vs数字比较的坑:为啥你的查询结果看起来矛盾?
嘿,我太懂这种“以为自己懂,结果被打脸”的感觉了!之前我也自信是MySQL熟手,直到遇到类似的字符串比较问题,才发现对类型转换的细节想当然了。咱们来一步步拆解你的问题:
先看你的查询结果到底为啥是这样
你执行的查询是:
SELECT DATE_FORMAT('2019-07-19 12:05:12', '%H') >= '11' AND DATE_FORMAT('2019-07-19 12:05:12', '%H') <= '7' AS 'str', DATE_FORMAT('2019-07-19 12:05:12', '%H') >= 11 AND DATE_FORMAT('2019-07-19 12:05:12', '%H') <= 7 AS 'num';
结果是str=1,num=0,核心差异在于比较两边的类型不同:
1. 字符串vs字符串比较(str列)
DATE_FORMAT()返回的是字符串类型,这里得到的是'12'。MySQL对字符串的比较规则是逐字符按ASCII码值对比:
'12' >= '11':先比第一个字符'1'和'1',相等;再比第二个字符'2'(ASCII=50)和'1'(ASCII=49),50>49,所以这个条件为真(1)'12' <= '7':直接比第一个字符'1'(ASCII=49)和'7'(ASCII=55),49<55,所以整个字符串'12'小于'7',这个条件也为真(1)- 两个真条件做AND运算,最终结果就是1
2. 字符串vs数字比较(num列)
当你把比较值写成数字11和7时,MySQL会触发自动类型转换:它会把字符串'12'转换成数字12,再做数字比较:
12 >=11是真(1),但12 <=7明显是假(0)- 真和假做AND运算,结果就是0
MySQL类型转换的核心规则
这里的关键是MySQL处理不同类型比较时的逻辑:
- 如果两边都是字符串:严格按字符串逐字符ASCII码对比,不管内容是不是数字
- 如果一边是字符串,一边是数字:MySQL会尝试把字符串转换成数字(从左到右提取连续数字,遇到非数字就停止;纯数字字符串会完全转成对应数字),然后按数字规则比较
- 特殊情况:如果字符串无法转换为有效数字(比如
'abc'),会被转成0
给你的避坑建议
如果要做时间相关的数值比较,推荐直接用返回数字类型的时间函数,比如HOUR(),它会直接返回小时数(数字),这样就不会有字符串比较的坑:
SELECT HOUR('2019-07-19 12:05:12') >=11 AND HOUR('2019-07-19 12:05:12') <=7 AS 'hour_num';
另外,如果你实际想表达的是“小时大于等于11,或者小于等于7”(跨午夜的时间范围),记得把AND改成OR,不然逻辑本身就不符合预期哦。
内容的提问来源于stack exchange,提问作者Syco
相关产品推荐
相关产品推荐

