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

时间:2014-10-22 19:37:36

标签: java mysql tomcat jdbc timezone

一些背景知识:

我在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.

为什么会这样?

35 个答案:

答案 0 :(得分:398)

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

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

答案 1 :(得分:52)

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

SET GLOBAL time_zone = '+3:00';

答案 2 :(得分:47)

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</dependency>

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.3</version>
</dependency>

保存pom.xml文件后,Maven会自动重新构建您的项目。

答案 3 :(得分: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);

参数 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 进入原来的罐子里。

答案 4 :(得分:28)

连接字符串应设置如下:

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

如果您要在xml文件(例如persistence.xmlstandalone-full.xml等)中定义连接,而不是&,则应使用{{1}或者使用&amp;块。

答案 5 :(得分:23)

我解决了将以下连接字符串放在URL

中的问题
jdbc:mysql://localhost:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

答案 6 :(得分:22)

在阅读了有关该主题的几篇文章之后,测试了不同的配置并基于this mysql bug thread的一些见解,这是我所了解的:

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

答案 7 :(得分: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 

答案 8 :(得分:14)

仅在application.properties上添加serverTimeZone = UTC即可为我工作。
all_components = [] SSC = [] explored= [] #c)modification of DFS def DFS_2_Path(graph,node): #global SSC global all_components explored.append(node) print('Node:',node) #index = [ind for ind,vertex in enumerate(df_reverse) if vertex[0] == node] for second_vert in graph: print('Second_vert:',second_vert) print('Second_vert[0] == node:',second_vert[0] == node) if second_vert[0] == node: print('second_vert[1] not in explored :',second_vert[1] not in explored) if second_vert[1] not in explored: print('SSC was:',SSC) SSC.append(second_vert[1]) print('SSC is:',SSC) print('---------------------------------') print('NEXT ITERATION OF THE INNER LOOP') print('-------------------------------------') DFS_2_Path(graph,second_vert[1]) if second_vert[1] in explored and len(SSC)> 0 :#check if second vert is not explored and if it's not a new SSC print('SSC was:',SSC) SSC.append(second_vert[1]) print('SSC is:',SSC) all_components.append(SSC) print('All_components is :',all_components) SSC[:] = [] print('All_components was:',all_components) for i in range(max(df_reversed_back[0]),0,-1): if i not in explored: s = i DFS_2_Path(df_reversed_back,i)

答案 9 :(得分:13)

  1. 我在 [mysqld]

    部分的mysql配置文件中添加了
    default_time_zone='+03:00'
    
  2. 然后重启mysql服务器:

    sudo service mysql restart
    
  3. +03:00 我的UTC时区。

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

    /etc/mysql/mysql.conf.d/mysqld.cnf
    

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

    我的网址jdbc连接:

    "jdbc:mysql://localhost/java"
    

答案 10 :(得分:12)

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

换句话说,只需在数据库服务器上将serverTimezone=UTC设置为不同的时区,就会移动从数据库中提取的所有日期

答案 11 :(得分:9)

我们需要解决的所有serverTimezone问题:

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

答案 12 :(得分:7)

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

spring.datasource.url = jdbc:mysql://localhost:3306/quartz_demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

答案 13 :(得分:7)

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

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

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

mysql> SELECT @@global.time_zone, @@session.time_zone;

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

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

答案 14 :(得分:6)

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

SET GLOBAL time_zone = '-6:00';

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

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

答案 15 :(得分:5)

以上程序将生成该时区错误。

您必须在数据库名称后添加:?useTimezone=true&serverTimezone=UTC。完成后,您的代码将可以正常工作。

好运:)

答案 16 :(得分:4)

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

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

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

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

答案 17 :(得分:4)

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

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.14</version>
    </dependency>

然后,您需要在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

答案 18 :(得分:4)

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

这实际上是解决此问题的方法,但不仅是将其复制并粘贴到程序中。如果您仅阅读该行,就会发现“结果”,这是我的数据库的名称,您必须编写您的数据库。

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

谢谢

答案 19 :(得分:4)

我已将以下行添加到我的/etc/mysql/my.cnf文件中:

default_time_zone='+00:00'

重新启动MySQL服务器:

systemctl restart mysql

它就像一种魅力。

答案 20 :(得分:4)

我遇到了与您类似的错误,但是我的服务器时区值为'Afr。中央西部 所以我做了这些步骤:

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....

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

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

  SET GLOBAL time_zone = '+1:00'

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

Enter the Following code in your Mysql Workbench and execute quesry

[source link for question/problem ]

[source link for answer]

[Solution ScreenShot ]

答案 21 :(得分:4)

运行以下查询到mysql数据库以解决该错误

MariaDB [xxx> SET @@global.time_zone = '+00:00';
Query OK, 0 rows affected (0.062 sec)

MariaDB [xxx]> SET @@session.time_zone = '+00:00';
Query OK, 0 rows affected (0.000 sec)

MariaDB [xxx]> SELECT @@global.time_zone, @@session.time_zone;

答案 22 :(得分:3)

按位置为 application.properties 文件中的 Spring Boot 应用程序设置时区

spring.datasource.url=jdbc:mysql://localhost:3306/db?serverTimezone=Europe/Berlin

解决了 CET / CEST 时区的问题。 pom.xml 使用 Maven 工件

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>

答案 23 :(得分:1)

我在LibreOffice Base中也遇到了完全相同的问题。所以我只是在连接字符串中指定了一个非“夏令时”。
**enter image description here**

我尝试了没有“&serverTimezone = MST”,但是也失败了。

我还尝试了“&serverTimezone = MDT”,但失败了,因此由于某种原因,它不喜欢夏令时!!

答案 24 :(得分:1)

我遇到了同样的错误,在我的情况下,我将服务器端口号更改为 3308 ,以前是3306。这将我的项目连接到MySQL数据库。

enter image description here

在这里,我们还必须更改连接代码。

Class.forName("com.mysql.cj.jdbc.Driver");
cn=(java.sql.Connection)DriverManager.getConnection("jdbc:mysql://localhost:3308/test2?zeroDateTimeBehavior=convertToNull","root","");

还必须在连接代码中更改端口号,例如localhost:3308才能解决该错误。

另外,在我的情况下,管理员属性。 enter image description here

答案 25 :(得分:1)

当我尝试在Windows上使用spring boot项目时,我遇到了同样的问题。

数据源网址应为:

spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

答案 26 :(得分:1)

我来晚了,但是,如果您正在努力解决以下错误并使用数据源(javax.sql.DataSource):

The server time zone value 'CEST' is unrecognized or represents more than one time zone.

设置以下行以消除错误:

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerTimezone("UTC");

答案 27 :(得分:1)

这对我有用。

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

此外,在春季启动配置中,必须将以下属性设置为

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

答案 28 :(得分:1)

我解决了这个问题,没有任何单一的代码更改。只需转到系统时间设置并设置时区。在我的情况下,默认时区是UTC,我更改为我的本地时区。在我重新启动所有服务后,一切都适合我。

答案 29 :(得分:0)

在我的情况下,这是一个测试环境,我必须使现有的应用程序能够在不进行任何配置更改的情况下工作,并且如果可能的话,也无需进行任何MySQL配置更改。 通过遵循@vinnyjames的建议并将服务器时区更改为UTC ,我能够解决此问题:

ln -sf /usr/share/zoneinfo/UTC /etc/localtime
service mysqld restart

这足以解决我的问题。

答案 30 :(得分:0)

同意@bluecollarcoder的答案,但是最好在连接字符串的末尾使用 TimeZone.getDefault().getID();

"jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=" + TimeZone.getDefault().getID();  

在这种情况下,Timezone参数会根据本地计算机时区自动更新。

答案 31 :(得分:0)

连接字符串对我有用

jdbc:mysql://localhost/<yourDbName>?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

我正在使用 Gradle 我的 build.gradle 文件是这样的

dependencies {
    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
    implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.17'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

答案 32 :(得分:-1)

我在NetBeans中也得到了相同的运行Java JDBC。这是固定的方式

我使用Xampp。在Apache的conf按钮中,我打开了httpd.conf文件,并在第一行中输入

# Set timezone to Europe/Athens UTC+02:00 
SetEnv TZ Europe/Athens.

在MySQL的conf按钮中,我打开了my.ini文件,并在最后一行输入 “欧洲/雅典”

停止并启动Apache和MySQL

问题已解决。

*(本地机器时区不同,但是没有问题。)

答案 33 :(得分:-3)

只需在application.properties文件中使用以下代码修改连接字符串。


spring.datasource.url=jdbc:mysql://localhost:3301/Db?
   useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=
   false&serverTimezone=UTC

答案 34 :(得分:-6)

package pack1;

import java.sql.Connection;
import java.sql.DriverManager;
import javax.swing.JOptionPane;

public class sqliteConnection {
    Connection conn=null;

    public static Connection dbConnector() {
        try {Class.forName("com.mysql.jdbc.Driver");

        Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306", "root", "");
        JOptionPane.showMessageDialog(null, "connection is succesful");
        return conn;

        } catch(Exception e) {
            JOptionPane.showMessageDialog(null, e);
            return null;

        ////you need also to execute this in database ===> SET GLOBAL time_zone = '+3:00';
        }
    }
}