MySQL datetime未存储微秒却在WHERE条件中使用为何无查询结果?
为什么带微秒的查询匹配不到datetime列的数据?
这个问题其实是MySQL处理datetime类型精度时的一个典型细节,我来给你拆解清楚:
1. 先搞懂datetime类型的存储逻辑
当你把列定义为datetime(不带精度参数)时,MySQL默认会把它当作datetime(0)来处理——也就是只存储到秒,微秒部分会被直接截断丢弃。比如你插入'2018-02-19 17:21:51.321343',实际存在表里的值是'2018-02-19 17:21:51',微秒部分完全没被保存。
2. 比较时的类型转换坑点
问题出在查询时的类型转换规则:当你用一个带微秒的字符串(比如'2018-02-19 17:21:51.321343')和datetime(0)类型的列做等值比较时,MySQL会自动把两边的操作数转换为相同精度的datetime类型——它会把精度低的datetime(0)值转换为精度更高的datetime(6),也就是给原来的秒后面补6个0,变成'2018-02-19 17:21:51.000000'。
而你查询条件里的字符串会被解析成datetime(6)类型的'2018-02-19 17:21:51.321343',这时候两个值显然不相等,自然查不到结果。
3. 实用解决方法
给你几个可行的解决方案:
- 直接去掉查询字符串的微秒部分:最直接的方式,比如写成:
select * from test where dt = '2018-02-19 17:21:51'; - 强制转换查询字符串的精度:用
cast()把带微秒的字符串转换成datetime(即datetime(0)),比如:select * from test where dt = cast('2018-02-19 17:21:51.321343' as datetime); - 截断到秒(MySQL 8.0+适用):用
date_trunc()函数把时间截断到秒级别:select * from test where dt = date_trunc('second', '2018-02-19 17:21:51.321343'); - 修改表结构(如果需要保留微秒):如果业务需要存储微秒,直接把列改成
datetime(6),这样插入和查询的微秒部分都会被正确处理。
内容的提问来源于stack exchange,提问作者Matúš Matula
相关产品推荐
相关产品推荐

