JDBC connection URL string 中的 serverTimezone 的作用到底是什么?

2020-08-23 15:24:46 +08:00
 JasonLaw

MySQL 时间“不正确”问题 - V2EX中,通过在 connection URL string 中显式地设置时区( serverTimezone=Asia/Shanghai )解决了问题。

但是我还是有很多疑问。为什么“在 connection URL string 中设置时区”会将所设置时区的时间存储到 MySQL ?到底是哪里进行这样的处理的?

以下是我查阅的一些资料:

1648 次点击
所在节点    数据库
4 条回复
yanyueio
2020-08-23 17:42:35 +08:00
reply: 到底哪里进行这样的处理。

国际化任务处理的时候,具体说就是时间处理。当我今天还在上海用中文时区,然后明天就到了西雅图用的美国西部时间。要在两个页面显示当地时间(从数据库读取出来的),那么要么 mysql 本身设置了统一的时区(通常 scm 不会给你权限重启 mysql),要么自己做好转换(通过连接字符串是一种补救措施)。

如果你的应用程序启动的时候和 mysql 启动时设置的时区是一样的,那么最好了,不用写 connection 参数,否则还是要告诉 mysql 我这边存进去的时间到底是什么时区的(否则一律按数据库的时区存,否则再读取出来就变味了)。

hope it helps.

btw: jvm 启动时可以用 `java.util.TimeZone.setDefault(TimeZone.getTimeZone("UTC"));`设置时区。
skai0dev
2020-08-23 17:59:29 +08:00
** serverTimezone **:
Override detection/mapping of time zone. Used when time zone from server doesn't map to Java time zone

from: https://dev.mysql.com/doc/connectors/en/connector-j-reference-configuration-properties.html
JasonLaw
2020-08-23 23:28:25 +08:00
@skai0dev #2 我有点不太理解“Override detection/mapping of time zone. Used when time zone from server doesn't map to Java time zone”,可以具体解释一下吗?谢谢。
JasonLaw
2020-08-24 15:37:24 +08:00
@yanyueio #1
@skai0dev #2

通过 @palfortime 在“MySQL 时间“不正确”问题 - V2EX”的回答 - https://www.v2ex.com/t/700563#reply15,我明白了为什么“在 connection URL string 中设置时区”会将所设置时区的时间存储到 MySQL ?明白了到底是哪里进行这样的处理的?。

https://github.com/mysql/mysql-connector-j/blob/79a4336f140499bd22dd07f02b708e163844e3d5/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeProtocol.java#L2228 中,会获取到 connection URL string 中所设置的 serverTimezone,最后会设置 serverSession 的 serverTimeZone 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/700702

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX