一个时间戳精度问题,引发了一个MySQL血案
----一个时间戳精度问题 , 引发了一个MySQL血案//----
----一个时间戳精度问题 , 引发了一个MySQL血案//----
----一个时间戳精度问题 , 引发了一个MySQL血案//----
----一个时间戳精度问题 , 引发了一个MySQL血案//----
----一个时间戳精度问题 , 引发了一个MySQL血案//----
----一个时间戳精度问题 , 引发了一个MySQL血案//----
"multi_version":false
文章来源:https://dwz.cn/ajsWJTWv
作者:阿杜的世界
最近工作中遇到两例mysql时间戳相关的问题 , 一个是mysql-connector-java和msyql的精度不一致导致数据查不到;另一例是应用服务器时区错误导致数据查询不到 。
通过这篇文章 , 希望能够解答关于mysql中时间戳的几个问题:
- mysql中的DATETIME精度为什么只支持到秒?
- mysql中的DATETIME类型跟时区有关吗?
- mysql设计表的时候 , 表示时间的字段改如何选择?
前段时间 , 将负责的应用的mysql-connector-java的版本从5.1.16升级到5.1.30 , 在做功能回归的时候发现 , 使用了类似上面的SQL的用例的运行时数据会有遗漏 , 导致功能有问题 。
考虑到我负责的应用中 , 有个功能需要用到类似下面这种SQL , 即使用时间戳作为查询的条件 , 查询在某个时间戳之后的所有数据 。
经过排查发现:mysql-connector-java在5.1.23之前会将秒后面的精度丢弃再传给MySQL服务端 , 正好我们使用的mysql版本中DATETIME的精度是秒;在我将mysql-connector-java升级到5.1.30后 , 从java应用通过mysql-connector-java将时间戳传到MySQL服务端的时候 , 就不会将毫秒数丢弃了 , 从mysql-connector-java的角度看是修复了一个BUG , 但是对于我的应用来说却是触发了一个BUG 。
如果你面对这个问题 , 你会怎么修复呢?
我们当时想了三种方案:
- 将mybatis的Mapper接口中的时间戳参数的类型 , 从java.util.Date改成java.sql.Date;
- 在传入Mapper接口之前 , 将传入的时间戳按秒取正 , 代码如下
经过验证 , 方案1会 , java.util.Date转过去的java.sql.Date对象会将日期之后的精度全部丢掉 , 从而导致查询出更多不必要的数据;方案3是可以的 , 就是可能会查出多一两条数据;方案2也是可以的 , 相当于从代码上对mysql-connector-java的特性做了补偿 。 最终我选择的是方案2 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
