国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

一起MySQL时间戳精度引发的血案

发布时间:2019/09/09标签:   时间    点击量:

原标题:一起MySQL时间戳精度引发的血案
前沿近来任务中碰到两例mysql时光戳相干的成绩,一个是mysql-connector-java和msyql的精度纷歧致招致数据查不到;另一例是利用效劳器时区过错招致数据查问不到。经过这篇文章,盼望可能解答对于mysql中时光戳的几个成绩: mysql中的DATETIME精度为甚么只支撑到秒? mysql中的DATETIME范例跟时区无关吗? mysql计划表的时间,表现时光的字段改怎样抉择?案例剖析 DATETIME的精度成绩在我担任的利用中,有个功效须要用到相似上面这类SQL,即便用时光戳作为查问的前提,查问在某个时光戳以后的全部数据。select*fromadu_userwheregmt_modified>=#{date}前段时光,将担任的利用的mysql-connector-java的版本从5.1.16进级到5.1.30,在做功效回归的时间发觉,应用了相似下面的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。案例复现应用homebrew装置MySQL,版本是8.0.15,装好后建一个表,用来寄存用户信息,SQL以下:应用spirngboot + mybatis作为开辟框架,界说一个用户实体,代码以下所示:界说该实体对应的Mapper,代码以下:设置衔接mysql相干的设置,代码以下:编写测试代码,先拔出一条数据,而后用时光戳作为查问前提去查问,代码以下:

版权信息Copyright ? 银河官网 版权所有??? ICP备案编号:鲁ICP备09013610号