一个时间戳精度问题,引发了一个MySQL血案

一个时间戳精度问题,引发了一个MySQL血案

----一个时间戳精度问题 , 引发了一个MySQL血案//----

一个时间戳精度问题,引发了一个MySQL血案

----一个时间戳精度问题 , 引发了一个MySQL血案//----

一个时间戳精度问题,引发了一个MySQL血案

----一个时间戳精度问题 , 引发了一个MySQL血案//----

一个时间戳精度问题,引发了一个MySQL血案

----一个时间戳精度问题 , 引发了一个MySQL血案//----

一个时间戳精度问题,引发了一个MySQL血案

----一个时间戳精度问题 , 引发了一个MySQL血案//----

一个时间戳精度问题,引发了一个MySQL血案

----一个时间戳精度问题 , 引发了一个MySQL血案//----


"multi_version":false

文章来源:https://dwz.cn/ajsWJTWv

作者:阿杜的世界

最近工作中遇到两例mysql时间戳相关的问题 , 一个是mysql-connector-java和msyql的精度不一致导致数据查不到;另一例是应用服务器时区错误导致数据查询不到 。

通过这篇文章 , 希望能够解答关于mysql中时间戳的几个问题:

  1. mysql中的DATETIME精度为什么只支持到秒?
  2. mysql中的DATETIME类型跟时区有关吗?
  3. mysql设计表的时候 , 表示时间的字段改如何选择?
案例分析:DATETIME的精度问题

前段时间 , 将负责的应用的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秒;
  • 经过验证 , 方案1会 , java.util.Date转过去的java.sql.Date对象会将日期之后的精度全部丢掉 , 从而导致查询出更多不必要的数据;方案3是可以的 , 就是可能会查出多一两条数据;方案2也是可以的 , 相当于从代码上对mysql-connector-java的特性做了补偿 。 最终我选择的是方案2 。

    特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。