今天遇见一个这个问题,解决后发出来分享一下:
java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' 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. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:71) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:247) at BookManagement.<init>(BookManagement.java:22) at BookManagement.main(BookManagement.java:64) Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' 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. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:59) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:83) at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:128) at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2201) at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2225) at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1391) at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:993) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:852) ... 7 more
下面是我问题的解决。
此错误是由于 MySQL JDBC 驱动程序在尝试确定服务器的时区时遇到问题。为了解决这个问题,你可以在 JDBC URL 中明确指定 serverTimezone
参数。
在你的 BookManagement
类中,找到以下连接字符串:
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/BookManagement?useSSL=false", "root", "mysecret");
并更改为:
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/BookManagement?useSSL=false&serverTimezone=UTC", "root", "mysecret");
这里,我们添加了 &serverTimezone=UTC
参数,以明确告诉 JDBC 驱动程序使用 UTC 时区。当然,你可以根据实际需要选择其他时区,但 UTC 通常是一个安全的选择。
应用此更改后,再次尝试运行你的程序。这应该会解决你遇到的时区问题。
这个问题的通用解决方案
这个问题是由于MySQL服务器和JDBC驱动程序之间的时区不匹配引起的。为了解决这个问题,你可以采取以下步骤:
serverTimezone
属性设置为与MySQL服务器时区匹配的值。例如,如果你的MySQL服务器位于UTC时区,可以将此属性设置为"UTC"。
String url = "jdbc:mysql://localhost:3306/your_database?serverTimezone=UTC";
Connection connection = DriverManager.getConnection(url, "your_username", "your_password");
SET GLOBAL time_zone = 'UTC';
这些步骤应该能够解决这个问题,确保MySQL服务器和Java应用程序之间的时区匹配。如果问题仍然存在,你可以考虑查看MySQL服务器的时区配置,以确保它与你的预期一致。此外,检查你的JDBC连接字符串和驱动程序版本是否正确配置也是很重要的。