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)
小智 80
我通过配置MySQL解决了这个问题.
SET GLOBAL time_zone = '+3:00';
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将自动重新构建项目.
小智 40
在阅读了有关该主题的几篇文章之后,测试了不同的配置,并基于我所了解的来自该mysql错误线程的一些见解:
useLegacyDatetimeCode=true它,与结合使用useJDBCCompliantTimezoneShift=true将使应用程序获得每个连接上的数据库时区。在这种模式下,GMT时区(例如“英国夏令时”)将转换为内部java / JDBC格式。可以在.properties文件(例如此文件)中定义新时区useJDBCCompliantTimezoneShift)和旧时间格式(useLegacyDatetimeCode)(请参见mysql jdbc连接器changelog)。因此设置这两个参数无效,因为它们会被完全忽略(新的默认值为useLegacyDateTimeCode=false)serverTimezone成为强制性的,如果任何时区(应用/数据库服务器)中的格式不是“UTC + XX”或“GMT + XX”jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC,即使您的应用程序/数据库服务器不在此时区中也是如此。重要的是应用程序连接字符串+数据库要与相同时区同步。 ,只需在数据库服务器上将serverTimezone = UTC设置为不同的时区,就会移动从数据库中提取的所有日期default-time-zone='+00:00'(在细节这个StackOverflow的交)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等..),而不是&你应该使用&或使用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.
小智 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
我在[mysqld]部分的mysql配置文件中添加了
default_time_zone='+03:00'
Run Code Online (Sandbox Code Playgroud)并重启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 语句:
使用以下 sql 语句检查是否设置了值:
选择@@global.time_zone,@@session.time_zone;
您可以在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)
这对我有用。
在DBeaver 6.0上:转到连接设置>驱动程序属性>服务器时区>设置UTC。
另外,在spring boot config中,必须设置以下属性。
jdbc:mysql:// localhost:/?serverTimezone = UTC
我在数据库端执行了以下操作。
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。第二个和第三个字符串组件表示您的用户名和密码,您必须相应地更改。
谢谢
| 归档时间: |
|
| 查看次数: |
412030 次 |
| 最近记录: |