MySQL时间戳精度

article/2025/11/7 0:06:12

现象

应用MySQL Connector/J(mysql-connector-java)升级,由5.1.20升级到5.1.30。

灰度发布后,发现查询功能异常,按照时间查询不到之前创建过的订单了

private Date searchDate;

对应查询SQL如下所示:其中MySQL中order_tbl表中的create_timestamp字段为TimeStamp类型。

select * from order_tbl where create_timestamp = #{searchDate}

排查过程

一、打印SQL参数

打印下SQL中的searchDate查询参数,判断异常机器和正常机器是否一致。
缩小排查范围。如果不一致,大概率是应用层哪块处理不一致导致的问题;反之基本可以确认是数据库驱动或者数据库层面的问题(因为本次也升级了MySQL Connector/J的版本)。

项目使用的是Mybaits ORM框架,这里直接是打开了Mybaits输出sql语句的配置。
发现灰度异常机器和正常机器输出的SQL参数 searchDate 是一致的,如:2020-01-29 09:21:31.031,都是带有小数位的。
结合应用变更,基本可以断定是由Connector/J版本升级导致的。

二、MySQL Connector/J Release Notes

查下对应版本的Release Notes。

发现在5-1-23版本Release Notes里有一项BugFix

The nativeSQL() method would always truncate fractional seconds rather than preserving the fractional part in the output string. Now Connector/J checks the server version: it preserves the fractional part for MySQL 5.6.4 and greater, and truncates the fractional part for older versions. (Bug #14748459, Bug #60598)

大意是:修改了nativeSQL方法,低版本Connector/J发给数据库的时间是秒级别的,小数秒位会被丢弃。

本次修改,如果MySQL server版本大于等于5.6.4,将会保留这个小数秒。(这也是查询异常的原因,DB里面的历史数据是不带小数秒的,查询的时候是以小数秒查询,必然是查询不出来的)

对应的代码变更如下:
https://github.com/mysql/mysql-connector-j/compare/5.1.22…5.1.23
在这里插入图片描述

为什么是5.6.4版本?

MySQL 5.6 has fractional seconds support for TIME, DATETIME, and TIMESTAMP values, with up to microseconds (6 digits) precision:

https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html

解决方案

方案1:设置create_timestamp字段小数精度优点:彻底解决问题;缺点:影响面比较大,数据整体都会受影响。

方案2:业务上看是否能去除类似的查询,尤其是时间类型的字段,受版本影响比较大,不建议作为严格匹配的条件。

方案3:查询前对searchDate进行强制转化,去除掉小数位。存在代码改动,并且改动不彻底。不建议。

方案4:jdbc驱动使用老模式解析timestamp


http://chatgpt.dhexx.cn/article/PY9lPQPt.shtml

相关文章

mysql时间戳转字符串

Mysql存储时间戳的问题 系统默认为int(11) 返回的是10位 防止溢出用 安全性的考虑 但是11位也还是可能溢出的吧? 溢出可能有哪些危害,可以解释下吗? 先谢谢啦! 11位不可能溢出 因为最大是10位 危害就是造成数据异常、程序异常 造成…

MySql时间戳和日期互换

MySql时间戳和日期互换 一、日期格式二、时间戳转日期三、日期转时间戳四、date_format(date,format) 一、日期格式 %M 月名字(January……December) %W 星期名字(Sunday……Saturday) %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)%Y 年, 数字, 4 位 %y 年, …

mysql时间戳的设置

选择类型为timestamp,然后默认值设置为CURRENT_TIMESTAMP,其他不用管。 再插入数据的时候会自动写上当前时间。

MySQL数据库中时间戳及时间戳的格式转换

一、什么是时间戳 时间戳是指格林威治时间自1970年1月1日(00:00:00 GMT)至当前时间的总秒数。通俗的讲,时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 常见有10位(单位:秒)…

I2C接口及驱动

1. 简介 I2C总结的基本的特征: 电路简单,只需要两根线,时钟线SCL和数据线SDAI2C为总线型结构,主设备依靠从设备地址进行寻址I2C总线上的设备可以为一主多从或者多主多从,多主多从模式下,需要提供仲裁和冲突…

CH341的I2C接口编程说明

CH341的I2C接口特性:(CH347为CH341的升级版,支持更高速的I2C速度,支持ACK检测以及I2C时钟延展等功能) 1、支持I2C速度20K/100K/400K/750K; 2、默认不支持设备的ACK应答监测,即忽略ACK状态&…

I2C 接口总结

I2C 接口总结 一、I2C 总线基本知识点 i2c总线是 Philips 公司首先推出的一种两线制串行传输总线。它由一根数据线(SDA)和一根 时钟线(SDL)组成。 所有主机在SCL 线上产生它们自己的时钟来传输I2C 总线上的报文数据,只…

通俗易懂:I2c总线

I2c: 简介 来源:I2C总线是一种简单、双向二线制同步串行总线。只有两条线作用:器件间近距离经常性数据通信(器件间:是在一块板子之内)比如hi3518ev200和外部的sensor传感器接口就是使用i2c总线的下图是使用i2c接口的OL…

I2C 接口介绍(物理层and协议层)

1. I2C 协议简介 I2C(Inter-Integrated Circuit) 协议是由 Philips 公司开发的,由于它具备引脚少、硬件实现简单、可扩展性强、不需要如 USART、CAN 的外部收发设备等特点,现在被广泛地使用在系统内多个集成电路 (I2C) 间的通信。根据I2C 总线协议版本 2…

【InterFace】I2C 总线详述

背景 昨天出去了一趟,人问:你熟悉什么?答:软硬件。结果,好尴尬。 硬件一般都做什么内容? 答:电源设计。 能说下升压、降压电路是怎么实现的吗? 答:不能。(Ps…

I2C接口及时序

1. I2C学习要点 1.有2条双向串行线,一条数据线SDA,一条时钟线SCL 如果只做master SCL可以只是输出 SDA在PAD上一定是inout pin,当然转为数字信号时可以分为两组 inout SDA; input sda_i; output sda_o; wire sda_oe…

I2C详解(二)

7-bit寻址数据传输 常见的传输方向及格式有如下两种: 主机写数据-从机接收,传输方向不变 要进行数据写入从机,首先主机发送START条件从机地址R/W0(写操作,设置为0),从机读取到该地址后回应ACK,主机将继续…

I2C的理解

一:I2C是什么? 它就是为了让机器之间能够相互明白的一种通信协议,本质上所有的通信协议例如I2C,SPI,USART等与让人类相互交流的中文,英文等没区别。前者是让机器之间能相互理解,后者让人类相互理…

I2C总线

目录 一、简介 二、通讯协议 2.1、物理层 2.2、协议层 2.2.1、数据有效性规定 2.2.2、起始信号与停止信号 2.2.3、响应 2.2.4、总线的寻址方式 一、简介 I2C(Inter-Integrated Circuit):内部集成电路。由飞利浦公司开发的…

I2C接口总结

1 I2C总线的特点 I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,通常最大频率为400Khz,…

关于I2C总线

两根线数据线SDA和时序线SCL,这让我想到了火线和零线。 总线上任何一个IC器件输出低电平都会使总线拉低,是线与的关系。 支持多主和主从工作方式 有效性:只有时钟线变成低电平数据线才能变化。 I2C的初始化应包括,起始信号&…

一篇短文让你彻底理解什么是I2C通信

一、I2C协议 I2C 也叫 IIC(Inter-Integrated Circuit)总线,是一种由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。它是半双工通信方式。 我们首先阅读以下这个例子,这会方便后…

I2C总线详解

1.1 I2C总线知识 1.1.1 I2C总线物理拓扑结构 I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态…

【i2c协议介绍】

文章目录 协议简单介绍五种速度模式master/slave和transmitter/receiver关系第一种情况:master作为transmitter,slave作为receiver第二种情况:当master作为receiver,slave作为transmitter i2c基本信号start产生stop信号数据传输有…

I2C详解(一)

I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时串行总线,常用于微控制器与外设之间的连接。要想了解详细I2C协议,目前最新的I2C标准协议是2014年第6版本,如下: I2…