休眠和 MySQL 的时区问题

Posted

技术标签:

【中文标题】休眠和 MySQL 的时区问题【英文标题】:Trouble with timezone with hibernate and MySQL 【发布时间】:2019-01-12 04:59:44 【问题描述】:

我正在尝试使用 tomcat (8.5) 和 mysql (v.8.0.12) 配置 hibernate(5.3.3 Final)。当我将 hibernate.connection.url 设置为 'jdbc:mysql://localhost:3306/sakila' 启动我的 HibernateTest.java(教程中的非常简单的代码,这里没有问题)时,我遇到了以下错误:

Caused by: java.sql.SQLException: The server time zone value 'Paris, Madrid 
(heure d?été)' is unrecognized or represents more than one time zone. You 
must configure either the server or JDBC driver (via the serverTimezone 
configuration property) to use a more specifc time zone value if you want to 
utilize time zone support.

MySQL 当前设置为全局和会话的“SYSTEM”时区(mysql> 选择@@global.time_zone,@@session.time_zone)。我的系统时区确实是巴黎/马德里。 在我的 hibernate.cfg.xml 文件中,当我编写连接 url 时:

jdbc:mysql://localhost:3306/sakila?useJDBCCompliantTimezoneShift=true;useLegacyDatetimeCode=false;serverTimezone=UTC;

错误是:

com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near '=false;serverTimezone=UTC;'.

这不是***帖子“mysql服务器时区和jdbc连接问题”中提到的问题,因为eclipse拒绝了“&”,请参见hibernate.cfg.xml文件的截图:

[对实体“useLegacyDatetimeCode”的引用必须以分隔符';'结尾] 1

正如 *** 帖子“格式错误的数据库 URL,无法解析主要 URL 部分”中提到的,它不是 'mysql:' 和 '//localhost' 之间的不可见字符。 我试图通过 MySql Workbench 设置适合马德里/巴黎夏季时间的本地时间选项(默认时区 = '+02:00')来解决这个问题(我的情况在这里)。它不会改变任何事情。 任何想法?我必须在其他地方配置它吗? 感谢您的帮助,我已经在这个上做了 3 天了,没有成功。

【问题讨论】:

【参考方案1】:

以下 URL 产生了错误:jdbc:mysql://localhost:3306/db?useLegacyDatetimeCode=false&serverTimezone=CET

这对我有用: 将& 替换为&

【讨论】:

【参考方案2】:

你需要转义&:

jdbc:mysql://localhost:3306/sakila?useSSL=false&serverTimezone=UTC

在此处查看更多信息:https://docs.jboss.org/exojcr/1.12.13-GA/developer/en-US/html/ch-db-configuration-hibernate.html

【讨论】:

【参考方案3】:

我终于找到了一个解决方案。 看起来既不是';' '&' 也不会添加多个参数,我取出所有参数,只尝试了一个参数:

jdbc:mysql://localhost:3306/sakila?serverTimezone=UTC

它成功了,我不再有这个问题了。

【讨论】:

以上是关于休眠和 MySQL 的时区问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql修改和查看时区(十五)

Mysql时区问题

一文解决MySQL时区相关问题

在 PHP 和 MySQL 上处理时区的最佳方法是啥?

MySQL设置时区和默认编码

MySQL:一文弄懂时区&time_zone