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

案例复现

利用homebrew安装MySQL , 版本是8.0.15 , 装好后建一个表 , 用来存放用户信息 , SQL如下:

使用spirngboot + mybatis作为开发框架 , 定义一个用户实体 , 代码如下所示:

定义该实体对应的Mapper , 代码如下:

设置连接mysql相关的配置 , 代码如下:

编写测试代码 , 先插入一条数据 , 然后用时间戳作为查询条件去查询 , 代码如下:

运行单测 , 如我们的设想 , 确实是没有查询出数据来 , 结果如下:

然后修改代码 , 利用上面的代码将查询的时间戳按秒取正 , 代码如下:

再次运行单测 , 如我们的设想 , 这次可以查询出数据来了 。

不过 , 这里有个小插曲 , 我在最开始设计表的时候 , 使用的SQL语句是下面这样的:

你一定发现了 , 这里的datetime已经支持小数点后更小的时间精度了 , 最多支持6位即最多可以支持到微妙级别 。 这个特性是什么时候引入的呢 , 我去查阅了MySQL的官方文档(https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html) , 发现这个特性是在mysql 5.6.4之后开始支持的 。

知识点总结

经过了前面的实际案例分析和案例复现 , 想必读者已经对mysql中DATETIME这个类型有了一定的认识 , 接下来跟我一起看下 , 我们从这个案例中可以总结出哪些经验 。

1.mysql-connector-java的版本和mysql的版本需要配套使用 , 例如5.6.4之前的版本 , 就最好不要使用mysql-connector-java的5.1.23之后的版本 , 否则就可能会遇到我们这次遇到的问题 。

2.MySQL中用来表示时间的字段类型有:DATE、DATETIME、TIMESTAMP , 它们之间有相同点 , 各自也有自己的特性 , 我总结了一个表格 , 如下所示:

3.DATETIME类型在MySQL中是以“YYYYMMDDHHMMSS”格式的整数存放的 , 与时区无关 , 使用8个字节的空间;

4.TIMESTAMP类型可以保存的时间范围要小很多 , 显示的值依赖时区 , MySQL的服务器、操作系统以及客户端连接都有时区的设置 。

5.一般情况下推荐使用DATETIME作为时间戳字段 , 不推荐使用bigint类型来存储时间 。

6.在开发中 , 应该尽量避免使用时间戳作为查询条件 , 如果必须要用 , 则需要充分考虑MySQL的精度和查询参数的精度等问题 。

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