服务器时区值“CEST”无法识别。

33

我正在使用Hibernate(Hibernate Maven 5.2.15.Final,Mysql-connector Maven 8.0.9-rc)在Linux的lampp环境中与MySQL 5.7配合使用。

我在意大利(中欧夏令时),一旦到3月25日,连接数据库会出现以下错误:

服务器时区值'CEST'无法识别或代表多个时区。如果要利用时区支持,必须通过服务器时间区配置属性或JDBC驱动程序(通过serverTimezone配置属性)配置更具体的时区值。

在MySQL控制台上,我运行了以下命令:

SHOW GLOBAL VARIABLES LIKE 'time_zone';
SET GLOBAL time_zone='Europe/Rome'; 

但这种情况并没有持续下去。

然后我在/etc/mysql目录下的my.cnf文件中添加了以下内容:

[mysqld] 
default-time-zone = 'Europe/Rome' 

还有:

default_time_zone = 'Europe/Rome' 

但是数据库服务器仍未启动...

为什么会出现这个错误?有人能帮帮我吗?

谢谢!


你需要在my.cnf文件中进行更改。请查看这个答案 - Mathieu de Lorimier
4个回答

33

@aiman的回答是不正确的,因为在你的情况下,有效的服务器时区不是UTC。

你会在网上找到一些解决方案,包括在jdbc连接字符串中添加附加参数,但在某些情况下,您无法更改此字符串。

这是我如何解决它的方法:

首先将系统时区导入mysql:

$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

然后在/etc/mysql/my.cnf(或者最近的 Debian/Ubuntu 发行版上的/etc/mysql/mysql.conf.d/mysqld.cnf)的[mysqld]部分中将您的默认 mysql 服务器时区设置为实际的服务器时区,例如:

default_time_zone = Europe/Paris

不要忘记重新启动 MySQL

$ sudo service mysql restart
< p >(或者根据您的发行版选择适当的命令)。

如果有人在Windows上遇到这个问题,这是我将时区导入MySQL的方法:按照此处下载SQL文件的说明操作:https://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html#time-zone-installation,然后执行 mysql -u root mysql < timezone_posix.sql - Kai Carver
这应该是正确的答案。我在网上搜索的任何其他答案都要么更改时区(!!!),要么更改连接字符串,有时不可能更改。谢谢! - David Sánchez
MySQL 8在Ubuntu上无法启动,显示[ERROR] [MY-010361] [Server] Fatal error: Illegal or unknown default time zone 'Europe/Paris' - Pavel Niedoba
重启后,您应该检查时区。 SELECT @@global.time_zone;。如果您看到SYSTEM,则表示更改未生效。我已将aDB用户显式设置为root SET GLOBAL time_zone ='Europe / Stockholm';,然后我可以使用hibernate连接。 - divanov

18

如果连接数据库时出现问题,我在这个答案的注释中找到了解决方案。

在您的连接URL中使用以下内容:


在您的连接URL中,请使用以下内容:
String url = "jdbc:mysql://localhost/mydb?serverTimezone=Europe/Rome";

这对我来说有效,可以连接到Flyway和时区欧洲/阿姆斯特丹。


2
它对我起作用了。请注意,serverTimezone=CEST不起作用,但Europe/Rome可以。 - xtian
是的,我相信这是因为CEST不够具体,而且S代表夏令时,因此无论一年中的时间如何,您都会告诉服务器/数据库它设置为夏令时。 - Hans Wouters
2
非常感谢,通过更改Europe/Paris时区,这对我很有效。 - Abdelmjid EL KIHEL
非常感谢,通过更改Europe/Berlin时区,这对我很有效。 - Twistleton

14

首先查看您的mysql服务器时区:
mysql -e "SELECT @@global.time_zone;" -u <mysqluser> -p.
大多数情况下应该是SYSTEM
找到您的系统时区:date +”%Z
看看它是否为CEST。
您需要更改您的系统时区:

#cd /usr/share/zoneinfo
#ls -l
#rm /etc/localtime
#ln -s /usr/share/zoneinfo/UTC /etc/localtime

然后重启你的mysql服务器:/etc/init.d/mysqld restart

享受吧!


1
不得不使用“systemctl restart mysql”来重新启动,但所有其他命令都帮了我 :) - MrG
1
谢谢,这个方法对我也有效。在尝试其他解决方案无果后,我终于解决了同样的问题。为了帮助可能遇到相同问题的人们,我想补充一点信息:当我尝试执行命令“rm /etc/localtime”和“ln -s /usr/share/zoneinfo/UTC /etc/localtime”时,出现了“权限被拒绝”的错误提示。我通过在开头添加“sudo”,例如:sudo rm /etc/localtime,解决了这个问题。 - Henrique
所以你将你实际的时区(CEST)更改为不是你所在时区的UTC。这不是一个解决方案,而是一个肮脏的变通方法。 - divanov

0

这个问题突然在我的开发机上出现了 - 重启MySQL解决了我的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接