MySQL JDBC驱动程序5.1.33 - 时区问题

blu*_*der 308 java mysql timezone tomcat jdbc

一些背景:

我在Tomcat 7上运行了一个Java 1.6 webapp.数据库是MySQL 5.5.以前,我使用Mysql JDBC驱动程序5.1.23连接到数据库.一切正常.我最近升级到Mysql JDBC驱动程序5.1.33.升级后,Tomcat会在启动应用程序时抛出此错误.

WARNING: Unexpected exception resolving reference
java.sql.SQLException: The server timezone value 'UTC' is unrecognized or represents more than one timezone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc timezone value if you want to utilize timezone support.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

blu*_*der 551

显然,要使MySQL JDBC驱动程序的5.1.33版本与UTC时区一起使用,必须serverTimezone在连接字符串中明确指定.

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Run Code Online (Sandbox Code Playgroud)

  • 这解决了我的错误.附加说明,逃避&与&amp; 在persistence.xml文件中:<property name ="javax.persistence.jdbc.url"value ="jdbc:mysql:// localhost/test?useUnicode = true&amp; useJDBCCompliantTimezoneShift = true&amp; useLegacyDatetimeCode = false&amp; serverTimezone = UTC"/> (19认同)
  • 那不对.useLegacyDatetimeCode = false不必指定serverTimezone,因此客户端会更正时区差异.这是MySQL客户端版本中的一个错误. (5认同)
  • 根据[文档](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html)useJDBCCompliantTimezoneShift使用useLegacyDatetimeCode =假时没有效果.因此那里不需要...... (3认同)
  • 除了GMT之外,这个解决方案破坏了时区.我认为正确的解决方案是[低于一个](/sf/answers/3130429151/) (2认同)

小智 80

我通过配置MySQL解决了这个问题.

SET GLOBAL time_zone = '+3:00';

  • 如果你使用MSK时区它是+3,那么你可以使用folowing作为db地址:`jdbc:mysql:// localhost/db?useUnicode = true&useJDBCCompliantTimezoneShift = true&useLegacyDatetimeCode = false&serverTimezone = Europe/Moscow`.看起来mysql-connector不能理解短时区名称. (6认同)
  • 当夏令时改变时钟时你会怎么做? (3认同)
  • 在mysql 8.0中,您可以调用“ setpersist time_zone ='+00:00';” 将其永久设置为UTC,而无需编辑my.cnf或重新启动服务器。参见https://mysqlserverteam.com/mysql-8-0-persisting-configuration-variables/ (2认同)

Gab*_*ita 49

如果你正在使用Maven,你可以设置另一个MySQL连接器版本(我有相同的错误,所以我从6.0.2改为5.1.39)pom.xml:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

正如另一个答案所述,此问题已在6.0.3或更高版本中修复,因此您可以使用更新版本:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

保存pom.xml文件后,Maven将自动重新构建项目.

  • 我甚至在8.0.12也有这个 (15认同)
  • 8.0.13给出了相同的错误.5.1.47但对我有用. (10认同)
  • 应该避免降级.另外,它还没有用"6.0.6"修复.更好地使用上述解决方案 (5认同)
  • 对于那些下载 mysql-connector-java/6 -&gt; 的人,只需下载例如 mysql-connector-java/5.1.20 就可以了。谢谢! (2认同)

小智 40

在阅读了有关该主题的几篇文章之后,测试了不同的配置,并基于我所了解的来自该mysql错误线程的一些见解:

  • 服务器时区尤其重要,这对于将数据库中存储的日期转换为应用程序服务器的时区非常重要。还有其他含义,但这是最明显的一个
  • GMT x UTC时区系统。GMT诞生于19世纪后期,可以在标准时间和夏季时间之间切换。此属性可能导致数据库服务器转换为夏季时间,而应用程序没有注意到它的情况(也许还有其他复杂情况,但我没有进一步研究)。UTC不会随时间变化(在0度经度处,它总是在平均太阳时间的1秒钟之内)。
  • 前面的mysql jdbc连接器版本5.1中引入了serverTimeZone定义。直到版本8为止,可以使用忽略useLegacyDatetimeCode=true它,与结合使用useJDBCCompliantTimezoneShift=true将使应用程序获得每个连接上的数据库时区。在这种模式下,GMT时区(例如“英国夏令时”)将转换为内部java / JDBC格式。可以在.properties文件(例如文件)中定义新时区
  • 从jdbc驱动程序版本8开始,删除了自动时间匹配(useJDBCCompliantTimezoneShift)和旧时间格式(useLegacyDatetimeCode)(请参见mysql jdbc连接器changelog)。因此设置这两个参数无效,因为它们会被完全忽略(新的默认值为useLegacyDateTimeCode=false
  • 以这种方式设置serverTimezone成为强制性的,如果任何时区(应用/数据库服务器)中的格式不是“UTC + XX”或“GMT + XX”
  • 将服务器时间设置为UTC不会产生影响(例如,使用jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC,即使您的应用程序/数据库服务器不在此时区中也是如此。重要的是应用程序连接字符串+数据库要与相同时区同步。 ,只需在数据库服务器上将serverTimezone = UTC设置为不同的时区,就会移动从数据库中提取的所有日期
  • MySQL的默认时区可以设置为UTC + 0与的my.ini或my.cnf中文件(Windows / Linux的分别地)通过将线default-time-zone='+00:00'(在细节这个StackOverflow的交
  • 自动为AWS(amazon Web服务)上配置的数据库分配UTC + 0默认时间(请参阅此处的AWS帮助页面

  • 很好的答案,谢谢。各种子弹都有用。我采纳了将 `default-time-zone = '+00:00'` 放入自制软件 `/usr/local/etc/my.cnf` 文件中的建议。不过,“=”周围的空格似乎很重要,因此您可以编辑该项目符号以包含它们。 (2认同)

Ali*_*lah 35

连接字符串应设置如下:

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Run Code Online (Sandbox Code Playgroud)

如果要定义在连接xml文件(如persistence.xml,standalone-full.xml等..),而不是&你应该使用&amp;或使用CDATA块.


ant*_*ar9 29

这是mysql-connector-java从版本5.1.33到5.1.37的错误.我在这里报告了它:http://bugs.mysql.com/bug.php?id = 79343

编辑:这已从mysql-connector-java 5.1.39更正

在loadTimeZoneMappings方法中,TimeUtil类中的拼写错误引发了NPE定位/com/mysql/jdbc/TimeZoneMapping.properties文件.如果查看代码,该文件应该位于TimeUtil类加载器中,而不是TimeZone:

TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE);
Run Code Online (Sandbox Code Playgroud)

参数useLegacyDatetimeCode允许在使用日期时自动更正客户端和服务器时区之间的差异.因此,它可以帮助您精确地在每个部分中不必指定时区.虽然使用serverTimeZone参数是一种解决方法,同时补丁被释放,你可以像我一样自己尝试更好地纠正代码.

  • 如果它是一个独立的应用程序,您可以尝试简单地将更正的com/mysql/jdbc/TimeUtil类添加到您的代码中并小心jar加载顺序.这可以提供帮助:https: //owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

  • 如果它是一个Web应用程序,更简单的解决方案是创建自己的mysql-connector-java-5.1.37-patched.jar,将.class直接替换为原始jar.

  • 在mysql-connector-java 6.0.2>中没有更正:( (26认同)
  • 该错误尚存在于8.0.11中 (5认同)
  • @Gili从版本6.0.6开始,这个问题没有得到解决 (4认同)
  • @JohnLittle我在8.0.15中也遇到了这个问题,但是它不再是由错误引起的。时区已正确加载,但是CET和CEST(这些时区给我带来了麻烦)既没有包含在TimeZone.getAvailableIDs()中,也没有包含在TimeZoneMapping.properties中,所以此解决方案在这里无济于事。解决方案可能是设置为“ serverTimezone = Europe / Berlin” (3认同)

小智 27

我解决了在URL中输入以下连接字符串的问题

jdbc:mysql://localhost:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Run Code Online (Sandbox Code Playgroud)


Ahm*_*URI 22

只需在application.properties上添加serverTimeZone = UTC即可。
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC


For*_*ran 18

  1. 我在[mysqld]部分的mysql配置文件中添加了

    default_time_zone='+03:00'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 并重启mysql服务器:

    sudo service mysql restart
    
    Run Code Online (Sandbox Code Playgroud)

其中+03:00我的UTC时区.

在我的os ubuntu 16.04上配置文件的路径:

/etc/mysql/mysql.conf.d/mysqld.cnf
Run Code Online (Sandbox Code Playgroud)

警告:如果您的时区有夏季和冬季时间.如果更改时间,您必须更改配置中的UTC.每年两次(通常)或与SUDO一起设置CRONTAB.

我的url jdbc连接:

"jdbc:mysql://localhost/java"
Run Code Online (Sandbox Code Playgroud)


小智 16

我有同样的问题,我解决了它只将"?serverTimezone = UTC"附加到我的字符串连接.

#

sinossi我的问题:

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

my dbDriver = com.mysql.jdbc.Driver

my jar = mysql-connector-java-8.0.12.jar

my java = 1.8

my tomcat = Apache Tomcat Version 8.5.32

my MySql server = MySql ver.8.0.12 
Run Code Online (Sandbox Code Playgroud)


小智 14

将服务器时间设置为 UTC 没有影响(例如使用jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC,即使您的应用程序/数据库服务器不在此时区。重要的是应用程序连接字符串 + 数据库与同一时区同步。

换句话说,只需serverTimezone=UTC在数据库服务器上设置不同的时区就会改变从数据库中提取的任何日期


Aat*_*med 13

The above program will generate that time zone error.

After your database name you have to add this: ?useTimezone=true&serverTimezone=UTC. Once you have done your code will work fine.

Best of luck :)


小智 9

解决问题所需的一切serverTimezone

String url = "jdbc:mysql://localhost:3306/db?serverTimezone=" + TimeZone.getDefault().getID()
Run Code Online (Sandbox Code Playgroud)


小智 9

显然,要使 MySQL JDBC 驱动程序的 5.1.33 版与 UTC 时区一起工作,必须在连接字符串中明确指定 serverTimezone。

spring.datasource.url = jdbc:mysql://localhost:3306/quartz_demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Run Code Online (Sandbox Code Playgroud)


小智 8

我正在使用mysql-connector-java-8.0.13并遇到相同的问题。我在命令行控制台中创建了数据库,并通过在命令行上使用@Dimitry Rud的解决方案解决了此问题:

SET GLOBAL time_zone = '-6:00';
Run Code Online (Sandbox Code Playgroud)

我不需要重新启动任何东西,设置时间并立即在eclipse中运行我的代码,它没有任何问题。

该错误应该在较旧的版本中修复,但是我认为我收到此错误是因为在控制台中创建数据库之后,我没有进行设置。我没有使用工作台,也没有使用其他应用程序而不是控制台来管理它。


小智 7

从 mysql 工作台运行以下 sql 语句:

  1. SET @@global.time_zone = '+00:00';
  2. SET @@session.time_zone = '+00:00';

使用以下 sql 语句检查是否设置了值:

选择@@global.time_zone,@@session.time_zone;

  • 当尝试从 IntelliJ IDEA 建立连接时出现相关错误时,这对我有用。 (2认同)

Are*_*efe 5

您可以在Maven依赖项中使用MySQL连接器,

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.14</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

然后,您需要在application.properties文件中设置正确的参数,

spring.datasource.url=jdbc:mysql://localhost:3306/UserReward?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=testuser
spring.datasource.password=testpassword
# MySQL driver
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
Run Code Online (Sandbox Code Playgroud)


Ani*_*wda 5

这对我有用。

在DBeaver 6.0上:转到连接设置>驱动程序属性>服务器时区>设置UTC。

另外,在spring boot config中,必须设置以下属性。

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


Vis*_*ant 5

我在数据库端执行了以下操作。

mysql> SET @@global.time_zone = '+00:00';

mysql> SET @@session.time_zone = '+00:00';

mysql> SELECT @@global.time_zone, @@session.time_zone;
Run Code Online (Sandbox Code Playgroud)

我正在使用服务器版本:8.0.17-MySQL社区服务器-GPL

来源:https : //community.oracle.com/thread/4144569?start=0&tstart=0


小智 5

我收到与您类似的错误,但我的服务器时区值为“Afr”。Centrale Ouest'所以我做了这些步骤:

MyError(在 IntelliJ IDEA 社区版上):

    InvalidConnectionAttributeException: The server time zone value 'Afr. centrale Ouest' 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 u....
Run Code Online (Sandbox Code Playgroud)

当我将 mysql 服务器升级到 SQL Server 8.0 (MYSQL80) 时,我遇到了这个问题。

解决这个问题最简单的方法就是在 MYSQL Workbench 中编写以下命令 -

  SET GLOBAL time_zone = '+1:00'
Run Code Online (Sandbox Code Playgroud)

时区后面的值将等于 GMT+/- 您所在时区的时差。上面的示例适用于北非 (GMT+1:00) / 或印度 (GMT+5:30)。它会解决这个问题。

在 Mysql Workbench 中输入以下代码并执行查询

[问题/问题的来源链接]

[答案来源链接]

[解决方案截图]


小智 5

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/resultout? useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC","root",""))
Run Code Online (Sandbox Code Playgroud)

这实际上是解决此问题的方法,但不要只是将其复制并粘贴到您的程序中。如果你只是阅读这一行,你会发现'resultout',这是我的数据库的名称,你必须写下你的。

字符串由三个部分组成,第一个是url,第二个是用户名,第三个是密码。在上面的段落中,我们清除了 url。第二个和第三个字符串组件表示您的用户名和密码,您必须相应地更改。

谢谢