mysql时区问题

前提背景1.mysql-connector-java的版本号8.0.21

1.在北京时间【Thu Dec 16 19:25:46】---timestamp【1608117946】往表里面插进一条时间数据,
jdbc参数serverTimezone=Asia/Shanghai
2.建立DTO,属性为Date的类型 【LocalDateTime的数据类型的话,值是一直不变】
3.从表里查那个时间数据

结果

1.设置jdbc参数serverTimezone=UTC
查出来的结果是【Thu Dec 17 03:25:46】【时区为北京时区】

2.设置jdbc参数serverTimezone=IST
查出来的结果是【Wed Dec 16 21:55:46】【时区为北京时区】

3.设置jdbc参数serverTimezone=Asia/Shanghai
查出来的结果是【Thu Dec 16 19:25:46】 【时区为北京时区】

个人猜测

mysql存储到硬盘的时间为时间戳【1608117946】
再根据serverTimezone的时间转为需要的时间。

serverTimezone的取值规律

1.先取jdbc:mysql://localhost:3306/***?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC
上serverTimezone的值
2.取mysql实例上time_zone的值
3.但是如果time_zone的值是SYSTEM ,那就取mysql实例上system_time_zone 的值
源码【版本号8.0.21】出处:类:com.mysql.cj.protocol.a.NativeProtocol #方法->configureTimezone
源码【版本号5.1.41】出处:类:com.mysql.jdbc.ConnectionImpl #方法->configureTimezone

时间转换问题

java的mysql驱动把timetsamp和datetime都转了
navicat的timestamp转,datetime没转

 set  time_zone = '+6:00';

SELECT * FROM user;

show VARIABLES like '%zone%';

user下分别有一个timestamp的数据和datetime的数据,测试一下就知道了
个人猜测
timestamp是mysql转的
datetime是java驱动转的

相关的链接

http://www.cocoachina.com/articles/52294
https://blog.csdn.net/ysy950803/article/details/88578892
https://juejin.cn/post/6844903476225376264

你可能感兴趣的:(mysql时区问题)