Trình điều khiển JDBC MySQL 5.1.33 - Vấn đề múi giờ


360

Một số nền tảng:

Tôi có một ứng dụng web Java 1.6 chạy trên Tomcat 7. Cơ sở dữ liệu là MySQL 5.5. Trước đây, tôi đã sử dụng trình điều khiển MysBC JDBC 5.1.23 để kết nối với DB. Tất cả mọi thứ đã làm việc. Gần đây tôi đã nâng cấp lên trình điều khiển MysBC JDBC 5.1.33. Sau khi nâng cấp, Tomcat sẽ đưa ra lỗi này khi khởi động ứng dụng.

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.

Tại sao chuyện này đang xảy ra?


1
URL JDBC của bạn trông như thế nào?
David Levesque

Kiểm tra câu trả lời của tôi stackoverflow.com/a/44720416/4592448 . Tôi nghĩ câu trả lời hay nhất của nó)
Fortran

Câu trả lời:


674

Rõ ràng, để phiên bản 5.1.33 của trình điều khiển JDBC của MySQL hoạt động với múi giờ UTC, người ta phải chỉ định serverTimezonerõ ràng trong chuỗi kết nối.

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

4
Theo tài liệu useJDBCCompliantTimezoneShift không có hiệu lực khi sử dụng useLegacyDatetimeCode = false. Do đó, không cần thiết ở đó ...
matof

24
Điều này giải quyết lỗi của tôi. Lưu ý bổ sung, thoát khỏi & với & amp; trong tập tin bền vững: <property name = "javax.persistence.jdbc.url" value = "jdbc: mysql: // localhost / test? useUnicode = true & amp; useJDBCCompliantTimezoneShift = true & amp; useLegacyDatetime
pdem

5
Điều đó không đúng. Điểm sử dụngLegacyDatetimeCode = false là không phải chỉ định serverTimezone để máy khách sửa các khác biệt về múi giờ. Đó là một lỗi trong phiên bản máy khách MySQL đó.
antgar9

2
Giải pháp này làm hỏng múi giờ trừ GMT. Tôi nghĩ rằng giải pháp đúng được đánh giá thấp dưới đây
DuncanSungWKim

1
giải pháp hoạt động với 8.0.17. Đã xảy ra với một cài đặt MySQL mới. Không thể tin rằng lỗi này đã không được sửa sau nhiều năm.
Tilman Hausherr

101

Tôi đã giải quyết vấn đề này bằng cách cấu hình MySQL.

SET GLOBAL time_zone = '+3:00';


6
nếu bạn đang sử dụng múi giờ MSK là +3, thì bạn có thể sử dụng folowing làm địa chỉ db : jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow. Có vẻ như trình kết nối mysql không hiểu tên múi giờ ngắn.
babay

2
Bạn làm gì khi Giờ tiết kiệm ánh sáng ban ngày thay đổi đồng hồ?
isapir

3
Với mysql 8.0, bạn có thể gọi "set contin time_zone = 'EST: 00';" để thiết lập nó thành UTC liên tục, không cần chỉnh sửa my.cnf hoặc khởi động lại máy chủ. Xem mysqlserverteam.com/ từ
ccleve 19/03/19

Nếu bạn đang thiết lập điều này thông qua một truy vấn SQL thủ công duy nhất, cài đặt này sẽ trở lại giá trị ban đầu sau khi khởi động lại DB.
CBA110

không hoạt động - hãy nhớ sửa đổi chuỗi múi giờ cục bộ của bạn thay cho +3 SET GLOBAL time_zone = '+3: 00';
Pravin

61

Sau khi đọc một số bài viết về chủ đề này, thử nghiệm các cấu hình khác nhau và dựa trên một số hiểu biết từ chủ đề lỗi mysql này là những gì tôi đã hiểu:

  • múi giờ của máy chủ đặc biệt quan trọng để chuyển đổi ngày được lưu trữ trong cơ sở dữ liệu sang múi giờ của máy chủ ứng dụng. có những hàm ý khác nhưng đây là ý nghĩa đáng chú ý nhất
  • GMT x hệ thống múi giờ UTC. GMT được hình thành vào cuối thế kỷ 19 và có thể được thay đổi giữa thời gian tiêu chuẩn và thời gian mùa hè. tài sản này có thể dẫn đến tình huống máy chủ cơ sở dữ liệu chuyển sang thời gian mùa hè và ứng dụng không nhận thấy điều đó (có thể có các biến chứng khác nhưng tôi không nghiên cứu thêm). UTC không thay đổi theo thời gian (nó luôn nằm trong khoảng 1 giây so với thời gian mặt trời trung bình ở kinh độ 0 °).
  • Định nghĩa serverTimeZone đã được giới thiệu trong phiên bản kết nối mysdb jdbc 5.1. cho đến phiên bản 8, nó có thể bị bỏ qua useLegacyDatetimeCode=true, kết hợp với useJDBCCompliantTimezoneShift=truenó sẽ khiến ứng dụng có được múi giờ cơ sở dữ liệu trên mọi kết nối. Trong chế độ này, các múi giờ GMT như 'Giờ mùa hè của Anh' sẽ được chuyển đổi sang định dạng java / JDBC nội bộ. Múi giờ mới có thể được xác định trong tệp .properations như cái này
  • Bắt đầu với trình điều khiển jdbc phiên bản 8, tính năng khớp thời gian tự động ( useJDBCCompliantTimezoneShift) và định dạng thời gian kế thừa ( useLegacyDatetimeCode) đã bị xóa ( xem thay đổi trình kết nối mysdb jdbc ). do đó, việc đặt 2 tham số này không có hiệu lực vì chúng bị bỏ qua hoàn toàn (mặc định mới là useLegacyDateTimeCode=false)
  • Theo cách này, cài đặt serverTimezonetrở thành bắt buộc nếu bất kỳ múi giờ nào (máy chủ ứng dụng / cơ sở dữ liệu) không ở định dạng 'UTC + xx' hoặc 'GMT + xx'
  • Không có tác động của việc đặt thời gian máy chủ như UTC (ví dụ với jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC, ngay cả khi máy chủ ứng dụng / cơ sở dữ liệu của bạn không ở múi giờ này. Điều quan trọng là chuỗi kết nối ứng dụng + cơ sở dữ liệu được đồng bộ hóa với cùng múi giờ. , chỉ cần đặt serverTimezone = UTC với múi giờ khác trên máy chủ cơ sở dữ liệu sẽ thay đổi bất kỳ ngày nào được trích xuất từ ​​cơ sở dữ liệu
  • Múi giờ mặc định của MySQL có thể được đặt thành UTC + 0 với các tệp my.ini hoặc my.cnf (tương ứng windows / linux) bằng cách thêm dòng default-time-zone='+00:00'(chi tiết trong bài đăng StackOverflow này )
  • Cơ sở dữ liệu được định cấu hình trên AWS (dịch vụ web amazon) được tự động gán thời gian mặc định UTC + 0 ( xem trang trợ giúp AWS tại đây )

1
Câu trả lời tốt đẹp, cảm ơn. Các viên đạn khác nhau đều hữu ích. Tôi đã đi với gợi ý để đặt một tập tin default-time-zone = '+00:00'homebrew /usr/local/etc/my.cnf. Dường như các không gian xung quanh =rất quan trọng vì vậy bạn có thể chỉnh sửa viên đạn đó để bao gồm chúng.
Đánh dấu Edington

51

Nếu bạn đang sử dụng Maven, bạn chỉ có thể đặt một phiên bản trình kết nối MySQL khác (tôi có cùng một lỗi, vì vậy tôi đã thay đổi từ 6.0.2 thành 5.1.39) trong pom.xml:

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

Như đã báo cáo trong các câu trả lời khác, sự cố này đã được khắc phục trong các phiên bản 6.0.3 trở lên, vì vậy bạn có thể sử dụng phiên bản cập nhật:

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

Maven sẽ tự động xây dựng lại dự án của bạn sau khi bạn lưu pom.xmltệp.


2
Đối với những người đã tải xuống mysql-Connector-java / 6 -> chỉ cần tải xuống, ví dụ như mysql-Connector-java / 5.1.20 và nó sẽ hoạt động. Cảm ơn!
Kết hợp

6
hạ cấp nên tránh. Ngoài ra, nó không cố định với 6.0.6tĩnh. tốt hơn để sử dụng giải pháp trên
phil294

tôi đang gặp lỗi tương tự ngay cả với jar mới nhất [mysql-Connector-java-6.0.5.jar: 6.0.5]
user2478236

18
Tôi có cái này ngay cả trong 8.0.12
Robert Niestroj

13
8.0.13 cho cùng một lỗi. 5.1.47 hoạt động với tôi tuy nhiên.
localhost

36

Chuỗi kết nối nên được đặt như thế này:

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

Nếu bạn đang định kết nối trong một xmltập tin (ví dụ như persistence.xml, standalone-full.xml, vv ..), thay vì &bạn nên sử dụng &amp;hoặc sử dụng một CDATAkhối.


1
Điều đó không đúng. Điểm sử dụngLegacyDatetimeCode = false là không phải chỉ định serverTimezone để máy khách sửa các khác biệt về múi giờ.
antgar9

Điều này làm việc cho tôi kết nối với MySQL 5.7 với phpStorm 2019.1.4.
moult86

29

Đây là một lỗi trong mysql-Connector-java từ phiên bản 5.1.33 đến 5.1.37. Tôi đã báo cáo nó ở đây: http://bugs.mysql.com/orms.php?id=79343

Đã chỉnh sửa: Điều này đã được sửa từ mysql-Connector-java 5.1.39

Đó là một lỗi đánh máy trong lớp TimeUtil trong phương thức loadTimeZoneMappings làm tăng tệp NPE định vị /com/mysql/jdbc/TimeZoneMapping.properies. Nếu bạn nhìn vào mã, tệp sẽ được đặt trong trình tải lớp TimeUtil, không phải TimeZone:

TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE);

Tham số useLegacyDatetimeCode cho phép tự động sửa lỗi chênh lệch giữa múi giờ của máy khách và máy chủ khi sử dụng ngày. Vì vậy, nó giúp bạn không phải chỉ định múi giờ trong mỗi phần. Mặc dù sử dụng tham số serverTimeZone là một cách giải quyết và trong khi đó bản vá được phát hành, bạn có thể thử tự sửa mã tốt hơn như tôi đã làm.

  • Nếu đó là một ứng dụng độc lập, bạn có thể thử chỉ cần thêm một lớp com / mysql / jdbc / TimeUtil đã sửa vào mã của bạn và cẩn thận với thứ tự tải jar. Điều này có thể giúp: https://owenou.com/2010/07/20/patching-with- class-shadowing-and-maven.html

  • Nếu đó là một ứng dụng web, giải pháp dễ dàng hơn là tạo mysql-Connector-java-5.1.37-patched.jar của riêng bạn, thay thế trực tiếp. Class vào jar gốc.


Ngọt ngào, cảm ơn vì đã báo cáo điều này. Vui mừng ai đó đã có thể xác định lỗi. Bạn có biết khi nào bản sửa lỗi sẽ được phát hành?
bluecollarcoder

Giải pháp bạn đang đề xuất là rất tốt, nhưng tôi nghĩ việc sửa đổi nguồn trình điều khiển và quản lý sự phụ thuộc Maven có lẽ quá khó chịu với hầu hết mọi người.
bluecollarcoder

4
@Gili Điều này không được sửa kể từ phiên bản
6.0.6

6
Lỗi này vẫn còn tồn tại trong 8.0.11
John Little

3
@JohnLittle Tôi cũng gặp vấn đề này trong 8.0.15, nhưng nó không còn do lỗi nữa. Các múi giờ được tải một cách chính xác, nhưng CET và CEST (các múi giờ này gây rắc rối cho tôi) không được bao gồm trong cả TimeZone.getAvailableIDs()và cũng không phải TimeZoneMapping.propertiesvì vậy giải pháp này sẽ không giúp ích ở đây. Giải pháp sẽ là cài đặt nhưserverTimezone=Europe/Berlin
JPT

29

Tôi đã giải quyết việc đặt chuỗi kết nối bên dưới vào URL

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

1
Điều đó không đúng. Điểm sử dụngLegacyDatetimeCode = false là không phải chỉ định serverTimezone để máy khách sửa các khác biệt về múi giờ.
antgar9

25

Nó hoạt động với tôi chỉ bằng cách thêm serverTimeZone = UTC trên application.properIES.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC


22
  1. Tôi đã thêm vào tập tin cấu hình mysql trong phần [mysqld]

    default_time_zone='+03:00'
  2. Và khởi động lại máy chủ mysql:

    sudo service mysql restart

Trong đó +03: 00 múi giờ UTC của tôi.

Đường dẫn đến tập tin cấu hình trên hệ điều hành Ubuntu 16.04 của tôi:

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

CẢNH BÁO: NẾU KHU THỜI GIAN CỦA BẠN CÓ MÙA H AND VÀ GIỜ GIỜ. BẠN PHẢI THAY ĐỔI UTC TRONG CONFIG NẾU THAY ĐỔI THỜI GIAN. HAI LẦN TRONG NĂM (USUALLY) HOẶC THIẾT LẬP CRONTAB VỚI SUDO.

Kết nối jdbc url của tôi:

"jdbc:mysql://localhost/java"

1
Phải khởi động lại Mysql về cơ bản là không thông minh trong hầu hết các trường hợp sử dụng sản xuất. Nó thậm chí còn trở thành một vấn đề khi các bản sao có liên quan.
bluecollarcoder

@bluecollarcoder Yêu cầu chỉ thêm trong phần [mysqld]. Hoặc thêm phần [mysqld] nếu không có phần đó. Ví dụ cấu hình của tôi pastebin.com/j4F7t2KS
Fortran

1
Tôi đã cập nhật / etc / localtime của máy chủ Linux của tôi từ / usr / share / zoneinfo / US / Pacific thành / usr / share / zoneinfo / America / Los_Angele sau đó khởi động lại dịch vụ mysql và điều này đã khắc phục sự cố cho tôi.
vinnyjames

Trong trường hợp của tôi đối với cú pháp được cung cấp, đã xảy ra lỗi khi khởi động lại và cú pháp đúng là: default-time-zone='+03:00'thay vào đó, theo câu trả lời này . Cũng đến từ DBeaver.
wscourge

Sẽ

16

Tôi có cùng một vấn đề và tôi đã giải quyết nó chỉ nối thêm "? ServerTimezone = UTC" vào kết nối chuỗi của tôi.

#

sinossi vấn đề của tôi:

java.sql.SQLException: Giá trị múi giờ của máy chủ 'CEST' không được nhận dạng hoặc đại diện cho nhiều hơn một múi giờ. Bạn phải định cấu hình trình điều khiển máy chủ hoặc JDBC (thông qua thuộc tính cấu hình serverTimezone) để sử dụng giá trị múi giờ cụ thể hơn nếu bạn muốn sử dụng hỗ trợ múi giờ.

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 

14

Chương trình trên sẽ tạo ra lỗi múi giờ đó.

Sau tên cơ sở dữ liệu của bạn, bạn phải thêm này : ?useTimezone=true&serverTimezone=UTC. Một khi bạn đã làm mã của bạn sẽ hoạt động tốt.

May mắn nhất :)


14

Tôi đã thực hiện sau đây về phía cơ sở dữ liệu của tôi.

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

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

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

Tôi đang sử dụng phiên bản Máy chủ: 8.0.17 - Máy chủ Cộng đồng MySQL - GPL

nguồn: https://community.oracle.com/thread/4144569?start=0&tstart=0


Bạn đã tiết kiệm thời gian của tôi. cảm ơn U.
Kumar

13

Mọi thứ chúng tôi cần để khắc phục sự cố với serverTimezone:

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

Nó cũng xảy ra với phiên bản 5.4.15 mới nhất. Nhưng đã sửa với điều này: thêm "? ServerTimezone =" + TimeZone.getDefault (). GetID () "ngay bên cạnh cơ sở dữ liệu của bạn, giải quyết các vấn đề.
Tes

10

Bạn có thể sử dụng trình kết nối MySQL trong phần phụ thuộc Maven,

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

Sau đó, bạn cần thiết lập các tham số đúng trong application.propertiestệp,

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

9

Tôi đang sử dụng mysql-Connector-java-8.0.13 và gặp vấn đề tương tự. Tôi đã tạo cơ sở dữ liệu của mình trong bảng điều khiển dòng lệnh và giải quyết vấn đề này bằng cách sử dụng giải pháp của @Dimitry Rud trên dòng lệnh:

SET GLOBAL time_zone = '-6:00';

Tôi không cần phải khởi động lại bất cứ thứ gì, đặt thời gian và ngay lập tức chạy mã của tôi trong nhật thực, nó không có vấn đề gì.

Lỗi được cho là đã được sửa trong phiên bản cũ hơn, nhưng tôi nghĩ rằng tôi đã gặp lỗi này vì sau khi tôi tạo cơ sở dữ liệu trong bảng điều khiển, tôi đã không đặt lỗi này. Tôi không sử dụng bàn làm việc hay ứng dụng khác để quản lý cái này hơn là bàn điều khiển.


6

Từ bàn làm việc mysql chạy các câu lệnh sql sau:

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

với các câu lệnh sql sau đây kiểm tra xem các giá trị đã được đặt chưa:

CHỌN @@ global.time_zone, @@ session.time_zone;


2
Điều này làm việc cho tôi khi lỗi trong câu hỏi xuất hiện trong khi cố gắng tạo kết nối từ IntelliJ IDEA.
Faheem Hassan Zun camera

6

Điều này làm việc cho tôi.

trên DBeaver 6.0: Chuyển đến Cài đặt kết nối> Thuộc tính trình điều khiển> Múi giờ của máy chủ> Đặt UTC.

Ngoài ra, trong cấu hình khởi động mùa xuân, phải đặt bên dưới thuộc tính.

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


5

Rõ ràng, để có được phiên bản 5.1.33 của trình điều khiển JDBC của MySQL hoạt động với múi giờ UTC, người ta phải chỉ định rõ ràng serverTimezone trong chuỗi kết nối.

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

3

Tôi cũng gặp vấn đề tương tự chính xác trong LibreOffice Base. Vì vậy, tôi chỉ chỉ định một "múi giờ tiết kiệm ánh sáng ban ngày" trong chuỗi kết nối.
** nhập mô tả hình ảnh ở đây **

Tôi đã thử mà không có "& serverTimezone = MST" nhưng điều đó cũng thất bại.

Tôi cũng đã thử "& serverTimezone = MDT" và điều đó không thành công, vì vậy, vì một số lý do, nó không giống như thời gian tiết kiệm ánh sáng ban ngày!


3

Tôi gặp vấn đề tương tự khi tôi cố gắng làm việc với dự án khởi động mùa xuân trên windows.

Url Datasource phải là:

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


3

Chạy bên dưới truy vấn tới mysql DB để khắc phục lỗi

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;

3

i Có lỗi tương tự như của bạn nhưng giá trị múi giờ của máy chủ là 'Afr. centrale Ouest 'vì vậy tôi đã làm các bước sau:

MyError (trên phiên bản cộng đồng 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....

Tôi đã gặp phải vấn đề này khi tôi nâng cấp máy chủ mysql của mình lên SQL Server 8.0 (MYSQL80).

Giải pháp đơn giản nhất cho vấn đề này chỉ là viết lệnh dưới đây trong Bàn làm việc MYSQL của bạn -

  SET GLOBAL time_zone = '+1:00'

Giá trị sau múi giờ sẽ bằng GMT +/- Chênh lệch múi giờ của bạn. Ví dụ trên dành cho Bắc Phi (GMT + 1: 00) / hoặc cho Ấn Độ (GMT + 5: 30). Nó sẽ giải quyết vấn đề.

Nhập mã sau vào Bàn làm việc Mysql của bạn và thực hiện quesry

[liên kết nguồn cho câu hỏi / vấn đề]

[liên kết nguồn để trả lời]

[Ảnh chụp màn hình giải pháp]


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

Đây thực sự là giải pháp cho vấn đề này, nhưng đừng chỉ sao chép và dán nó vào chương trình của bạn. Nếu bạn chỉ đọc dòng bạn sẽ tìm thấy 'kết quả', đó là tên cơ sở dữ liệu của tôi và bạn phải viết của bạn.

Có ba thành phần chuỗi, đầu tiên là url, thứ hai là tên người dùng và thứ ba là mật khẩu. Trong đoạn trên chúng tôi đã xóa, url. Các thành phần Chuỗi thứ hai và thứ ba như đã nói tên người dùng và mật khẩu của bạn, bạn phải thay đổi tương ứng.

Cảm ơn


1

Tôi đã giải quyết vấn đề này mà không có bất kỳ thay đổi mã nào. chỉ cần cài đặt thời gian hệ thống goto và đặt múi giờ. Trong trường hợp của tôi, múi giờ mặc định là UTC mà tôi đã đổi thành múi giờ địa phương. Sau khi tôi khởi động lại tất cả các dịch vụ, mọi thứ đều hoạt động với tôi.


1

Tôi đến trễ, nhưng nếu bạn đang vật lộn với lỗi sau và sử dụng nguồn dữ liệu (javax.sql.DataSource):

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

Đặt dòng sau để thoát khỏi lỗi:

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

1

Trong trường hợp của tôi, đó là một môi trường thử nghiệm và tôi phải làm cho một ứng dụng hiện có hoạt động mà không có bất kỳ thay đổi cấu hình nào, và nếu có thể mà không có bất kỳ thay đổi cấu hình MySQL nào. Tôi đã có thể khắc phục sự cố bằng cách làm theo đề xuất của @vinnyjames và thay đổi múi giờ của máy chủ thành UTC :

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

Làm điều đó là đủ để tôi giải quyết vấn đề.


1

Tôi đã thêm dòng sau vào /etc/mysql/my.cnftập tin của mình :

default_time_zone='+00:00'

Đã khởi động lại máy chủ MySQL:

systemctl restart mysql

Và nó hoạt động như một lá bùa.


0

Đồng ý với câu trả lời @bluecollarcoder, nhưng tốt hơn là sử dụng TimeZone.getDefault().getID();ở cuối chuỗi kết nối:

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

Trong trường hợp này, Timezonetham số tự động cập nhật tùy thuộc vào múi giờ của máy cục bộ.


Điều đó không đúng. Điểm sử dụngLegacyDatetimeCode = false là không phải chỉ định serverTimezone để máy khách sửa các khác biệt về múi giờ.
antgar9

0

Chỉ cần sửa đổi chuỗi kết nối với mã sau trong tệp application.properIES.


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

0

Không có tác động của việc đặt thời gian máy chủ là UTC (ví dụ với jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC , ngay cả khi máy chủ ứng dụng / cơ sở dữ liệu của bạn không ở múi giờ này. Điều quan trọng là chuỗi kết nối ứng dụng + cơ sở dữ liệu được đồng bộ hóa với cùng múi giờ.

Nói cách khác, chỉ cần thiết lập serverTimezone=UTCvới múi giờ khác trên máy chủ cơ sở dữ liệu sẽ thay đổi bất kỳ ngày nào được trích xuất từ ​​cơ sở dữ liệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.