ไดร์เวอร์ MySQL JDBC 5.1.33 - ปัญหาโซนเวลา


360

พื้นหลังบางส่วน:

ฉันมี Java 1.6 webapp ทำงานบน Tomcat 7 ฐานข้อมูลคือ 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.

ทำไมสิ่งนี้จึงเกิดขึ้น


1
JDBC URL ของคุณเป็นอย่างไร
David Levesque

ตรวจสอบคำตอบของฉันstackoverflow.com/a/44720416/4592448 ฉันคิดว่ามันเป็นคำตอบที่ดีที่สุด)
Fortran

คำตอบ:


673

เห็นได้ชัดว่าในการรับรุ่น 5.1.33 ของไดรเวอร์ MySQL JDBC เพื่อทำงานกับโซนเวลา UTC เราต้องระบุserverTimezoneอย่างชัดเจนในสตริงการเชื่อมต่อ

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

4
ตามเอกสารที่ใช้ JDBCCompliantTimezoneShift ไม่มีผลเมื่อใช้ useLegacyDatetimeCode = false ดังนั้นจึงไม่จำเป็นต้องมี ...
58

24
นี่เป็นการแก้ไขข้อผิดพลาดของฉัน หมายเหตุเพิ่มเติมให้หลีก & & กับ & 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>
pdem

5
ไม่ถูกต้อง จุดของ useLegacyDatetimeCode = false ไม่จำเป็นต้องระบุ serverTimezone ดังนั้นไคลเอนต์แก้ไขเขตเวลาที่แตกต่างกัน มันเป็นข้อผิดพลาดในไคลเอนต์ MySQL รุ่นนั้น
antgar9

2
วิธีนี้จะทำให้เขตเวลาเสียหายยกเว้นใน GMT ฉันคิดว่าวิธีการแก้ปัญหาที่ถูกต้องนั้นมีค่าต่ำกว่าหนึ่ง
DuncanSungWKim

1
โซลูชันทำงานได้กับ 8.0.17 เกิดขึ้นกับการติดตั้ง MySQL ใหม่ ไม่อยากเชื่อเลยว่าข้อผิดพลาดนี้ไม่ได้รับการแก้ไขหลังจากผ่านไปหลายปี
Tilman Hausherr

101

ฉันแก้ไขปัญหานี้ด้วยการกำหนดค่า MySQL

SET GLOBAL time_zone = '+3:00';


6
หากคุณกำลังใช้ MSK เขตเวลามันเป็น 3 แล้วคุณอาจใช้ folowing jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscowเป็นที่อยู่ฐานข้อมูล: ดูเหมือนว่าตัวเชื่อมต่อ mysql ไม่เข้าใจชื่อเขตเวลาสั้น ๆ
babay

2
คุณจะทำอย่างไรเมื่อเวลาออมแสงเปลี่ยนนาฬิกา
isapir

3
ด้วย mysql 8.0 คุณสามารถเรียก "set persist time_zone = '+00: 00';" เพื่อตั้งค่าเป็น UTC อย่างถาวรโดยไม่จำเป็นต้องแก้ไข my.cnf หรือรีสตาร์ทเซิร์ฟเวอร์ ดูmysqlserverteam.com/…
ccleve

หากคุณกำลังตั้งค่านี้ผ่านการสืบค้น SQL ด้วยตนเองที่ไม่ซ้ำใครการตั้งค่านี้จะเปลี่ยนกลับเป็นค่าเดิมหลังจากรีสตาร์ท DB
CBA110

ทำงานได้ - อย่าลืมแก้ไขสตริงเขตเวลาท้องถิ่นของคุณแทนที่ +3 SET GLOBAL time_zone = '+3: 00';
Pravin

61

หลังจากอ่านโพสต์ในหัวข้อนี้หลายครั้งการทดสอบการกำหนดค่าที่แตกต่างกันและขึ้นอยู่กับข้อมูลเชิงลึกจากเธรด bug mysql นี้ซึ่งเป็นสิ่งที่ฉันเข้าใจ:

  • เขตเวลาของเซิร์ฟเวอร์มีความสำคัญอย่างยิ่งในการแปลงวันที่ที่จัดเก็บในฐานข้อมูลเป็นเขตเวลาของแอพพลิเคชันเซิร์ฟเวอร์ มีความหมายอื่น ๆ แต่นี่เป็นสิ่งที่เห็นได้ชัดเจนที่สุด
  • GMT + UTC ระบบโซนเวลา GMT ถูกสร้างขึ้นในช่วงปลายศตวรรษที่ 19 และสามารถเลื่อนระหว่างเวลามาตรฐานและเวลาฤดูร้อน คุณสมบัตินี้อาจนำไปสู่สถานการณ์ที่เซิร์ฟเวอร์ฐานข้อมูลเปลี่ยนไปเป็นฤดูร้อนและแอปพลิเคชันไม่ได้สังเกตเห็น (อาจมีภาวะแทรกซ้อนอื่น ๆ แต่ฉันไม่ได้ทำการวิจัยเพิ่มเติม) UTC ไม่ได้เปลี่ยนแปลงตลอดเวลา (ภายใน 1 วินาทีของเวลาสุริยะเฉลี่ยที่ 0 °ลองจิจูด)
  • คำจำกัดความ serverTimeZone ถูกนำมาใช้ในตัวเชื่อมต่อ mysql jdbc เวอร์ชัน 5.1 ล่วงหน้า จนถึงเวอร์ชัน 8 มันอาจถูกละเว้นด้วยuseLegacyDatetimeCode=trueซึ่งuseJDBCCompliantTimezoneShift=trueจะทำให้แอปพลิเคชันได้รับโซนเวลาของฐานข้อมูลในทุกการเชื่อมต่อ ในโหมดนี้ GMT โซนเวลาเช่น 'British Summer Time' จะถูกแปลงเป็นรูปแบบ java / JDBC ภายใน สามารถกำหนดเขตเวลาใหม่ในไฟล์. properties เช่นอันนี้
  • เริ่มต้นด้วยไดรเวอร์ jdbc เวอร์ชัน 8 การจับคู่เวลาอัตโนมัติ ( useJDBCCompliantTimezoneShift) และรูปแบบเวลาดั้งเดิม ( useLegacyDatetimeCode) ถูกลบ ( ดูที่ mysql jdbc connector changelog ) ดังนั้นการตั้งค่าพารามิเตอร์ 2 เหล่านี้จะไม่มีผลเนื่องจากถูกละเว้นทั้งหมด (ค่าเริ่มต้นใหม่คือ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 services) ได้รับการกำหนดเวลา UTC + 0 โดยอัตโนมัติ ( ดูหน้าช่วยเหลือของ AWS ที่นี่ )

1
คำตอบที่ดีขอบคุณ สัญลักษณ์แสดงหัวข้อย่อยต่าง ๆ มีประโยชน์ทั้งหมด ฉันไปกับข้อเสนอแนะเพื่อใส่default-time-zone = '+00:00'ลงใน/usr/local/etc/my.cnfไฟล์homebrew ดูเหมือนว่าช่องว่างรอบ ๆ=นั้นสำคัญ แต่คุณอาจแก้ไขสัญลักษณ์แสดงหัวข้อย่อยเพื่อรวมไว้
Mark Edington

51

หากคุณใช้ 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>

ตามที่รายงานไว้ในคำตอบอื่นปัญหานี้ได้รับการแก้ไขในเวอร์ชัน 6.0.3 หรือสูงกว่าดังนั้นคุณจึงสามารถใช้เวอร์ชันที่อัปเดตได้:

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

Maven จะสร้างโครงการของคุณใหม่โดยอัตโนมัติหลังจากที่คุณบันทึกpom.xmlไฟล์


2
สำหรับผู้ที่ดาวน์โหลด mysql-connector-java / 6 -> เพียงดาวน์โหลดเช่น mysql-connector-java / 5.1.20 และมันควรจะทำงาน ขอบคุณ!
รวม

6
ควรหลีกเลี่ยงการปรับลดรุ่น นอกจากนี้ยังไม่ได้รับการแก้ไขด้วย6.0.6ภาพนิ่ง ดีกว่าที่จะใช้วิธีการแก้ปัญหาข้างต้น
phil294

ฉันได้รับข้อผิดพลาดเดียวกันแม้จะมี jar ล่าสุด [mysql-connector-java-6.0.5.jar: 6.0.5]
user2478236

18
ฉันมีสิ่งนี้แม้กระทั่งใน 8.0.12
Robert Niestroj

13
8.0.13 ให้ข้อผิดพลาดเดียวกัน 5.1.47 ใช้ได้สำหรับฉันอย่างไรก็ตาม
localhost

36

สตริงการเชื่อมต่อควรถูกตั้งค่าดังนี้:

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

หากคุณกำลังกำหนดเชื่อมต่อในxmlไฟล์ (เช่นpersistence.xml, standalone-full.xmlฯลฯ .. ) แทน&คุณควรใช้&amp;หรือใช้CDATAบล็อก


1
ไม่ถูกต้อง จุดของ useLegacyDatetimeCode = false ไม่จำเป็นต้องระบุ serverTimezone ดังนั้นไคลเอนต์แก้ไขเขตเวลาที่แตกต่างกัน
antgar9

สิ่งนี้ใช้ได้สำหรับฉันที่เชื่อมต่อกับ MySQL 5.7 ด้วย phpStorm 2019.1.4
moult86

29

นี่เป็นข้อบกพร่องใน mysql-connector-java จากรุ่น 5.1.33 ถึง 5.1.37 ฉันรายงานที่นี่: http://bugs.mysql.com/bug.php?id=79343

แก้ไข: สิ่งนี้ได้รับการแก้ไขจาก mysql-connector-java 5.1.39

มันเป็นตัวพิมพ์ผิดในคลาส TimeUtil ในวิธี loadTimeZoneMappings ที่ทำให้ 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

  • หากเป็นเว็บแอปพลิเคชันทางออกที่ง่ายกว่าคือการสร้าง mysql-connector-java-5.1.37-patched.jar ของคุณเองแทนที่ subclass .class โดยตรงลงใน jar ดั้งเดิม


น่ารักขอบคุณที่รายงานสิ่งนี้ ดีใจที่มีคนสามารถที่จะลงจุดบกพร่อง คุณรู้หรือไม่ว่าการแก้ไขจะออกเมื่อใด
bluecollarcoder

วิธีแก้ปัญหาที่คุณแนะนำนั้นดีมาก แต่ฉันคิดว่าการแก้ไขแหล่งไดรเวอร์และการจัดการการพึ่งพา Maven นั้นน่ารำคาญสำหรับคนส่วนใหญ่
bluecollarcoder

4
@Gili สิ่งนี้ไม่ได้รับการแก้ไขตั้งแต่วันที่รีลีส 6.0.6
Imme22009

6
ข้อผิดพลาดมีอยู่ใน 8.0.11
John Little

3
@ JohnLittle ฉันมีปัญหานี้ด้วยเช่นกันใน 8.0.15 แต่มันไม่ได้เกิดจากข้อผิดพลาดอีกต่อไป มีการโหลดเขตเวลาอย่างถูกต้อง แต่ CET และ CEST (เขตเวลาเหล่านี้ทำให้เกิดปัญหากับฉัน) จะไม่รวมอยู่ในTimeZone.getAvailableIDs()หรือในTimeZoneMapping.propertiesดังนั้นโซลูชันนี้จะไม่ช่วยที่นี่ วิธีแก้ปัญหาจะเป็นเช่นการตั้งค่าserverTimezone=Europe/Berlin
JPT

29

ฉันแก้ไขการวางสายเชื่อมต่อด้านล่างใน URL

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

1
ไม่ถูกต้อง จุดของ useLegacyDatetimeCode = false ไม่จำเป็นต้องระบุ serverTimezone ดังนั้นไคลเอนต์แก้ไขเขตเวลาที่แตกต่างกัน
antgar9

25

มันทำงานได้สำหรับฉันเพียงแค่เพิ่ม serverTimeZone = UTC ใน application.properties
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC


22
  1. ฉันเพิ่มในไฟล์ config mysql ในส่วน[mysqld]

    default_time_zone='+03:00'
  2. และรีสตาร์ทเซิร์ฟเวอร์ mysql:

    sudo service mysql restart

อยู่ที่ไหน03: 00โซนเวลา UTC ของฉัน

พา ธ ไปยังไฟล์กำหนดค่าบนระบบปฏิบัติการ Ubuntu ของฉัน 16.04:

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

คำเตือน: ถ้าโซนเวลาของคุณมีฤดูร้อนและฤดูหนาว คุณต้องเปลี่ยน UTC ในการกำหนดค่าหากเปลี่ยนเวลา สองครั้งในปี (ปกติ) หรือตั้ง CRONTAB พร้อม SUDO

การเชื่อมต่อ url jdbc ของฉัน:

"jdbc:mysql://localhost/java"

1
ต้องรีสตาร์ท Mysql นั้นเป็น nonstarter ในเกือบทุกกรณีใช้ผลิต มันจะกลายเป็นปัญหามากขึ้นเมื่อมีการทำซ้ำ
bluecollarcoder

@bluecollarcoder ต้องการเพิ่มเฉพาะในส่วน [mysqld] หรือเพิ่มส่วน [mysqld] หากไม่มีส่วน ตัวอย่าง config ของฉัน pastebin.com/j4F7t2KS
Fortran

1
ฉันอัปเดตเซิร์ฟเวอร์ / etc / localtime ของ Linux จาก / usr / share / zoneinfo / US / Pacific เป็น / usr / share / zoneinfo / America / Los_Angeles จากนั้นเริ่มบริการ mysql ใหม่และแก้ไขปัญหาสำหรับฉันแล้ว
vinnyjames

ในกรณีของฉันสำหรับไวยากรณ์ที่ให้ไว้มีข้อผิดพลาดเมื่อรีสตาร์ทและไวยากรณ์ที่ถูกต้องคือ: default-time-zone='+03:00'แทนตามคำตอบนี้ ยังมาจาก DBeaver
wscourge

มันไม่เหมาะสมถ้าคุณต้องบอกกับนักพัฒนาทุกคนใน บริษัท ของคุณเพื่อปรับเปลี่ยนการตั้งค่า MySQL ของพวกเขา :)
38419

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 

14

โปรแกรมด้านบนจะสร้างข้อผิดพลาดของเขตเวลานั้น

?useTimezone=true&serverTimezone=UTCหลังชื่อฐานข้อมูลของคุณคุณจะต้องเพิ่มนี้: เมื่อคุณได้ทำรหัสของคุณจะทำงานได้ดี

ขอให้โชคดี :)


14

ฉันดำเนินการตามด้านฐานข้อมูลของฉัน

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 Community Server - GPL

แหล่งที่มา: https://community.oracle.com/thread/4144569?start=0&tstart=0


คุณช่วยเพื่อนเวลาของฉัน ขอบคุณคุณ
กุมาร

13

ทุกสิ่งที่เราจำเป็นต้องแก้ไขปัญหาด้วยserverTimezone:

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

มันเกิดขึ้นกับฉันด้วยรุ่น 5.4.15 ล่าสุด แต่คงด้วยนี้เพิ่ม "serverTimezone =?" + TimeZone.getDefault () getID ()" ติดกับฐานข้อมูล ur แก้ปัญหา..
Tes

10

คุณสามารถใช้ตัวเชื่อมต่อ MySQL ในการพึ่งพา Maven

<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

9

ฉันใช้mysql-connector-java-8.0.13และมีปัญหาเดียวกัน ฉันสร้างฐานข้อมูลของฉันในคอนโซลบรรทัดคำสั่งและแก้ไขปัญหานี้โดยใช้โซลูชัน @Dimitry Rudบนบรรทัดคำสั่ง:

SET GLOBAL time_zone = '-6:00';

ฉันไม่จำเป็นต้องรีสตาร์ทอะไรตั้งเวลาและเรียกใช้โค้ดของฉันใน eclipse ทันทีมันเชื่อมต่อโดยไม่มีปัญหา

ข้อผิดพลาดควรได้รับการแก้ไขในรุ่นที่เก่ากว่า แต่ฉันคิดว่าฉันได้รับข้อผิดพลาดนี้เพราะหลังจากที่ฉันสร้างฐานข้อมูลในคอนโซลฉันไม่ได้ตั้งค่านี้ ฉันไม่ได้ใช้ workbench หรือแอปอื่นเพื่อจัดการสิ่งนี้มากกว่าคอนโซล


6

จาก mysql workbench ให้เรียกใช้คำสั่ง sql ต่อไปนี้:

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

ด้วยคำสั่ง sql ต่อไปนี้ตรวจสอบว่ามีการตั้งค่าหรือไม่:

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


2
สิ่งนี้ใช้ได้สำหรับฉันเมื่อเกิดข้อผิดพลาดในข้อสงสัยขณะพยายามเชื่อมต่อจาก IntelliJ IDEA
Faheem Hassan Zunjani

6

สิ่งนี้ใช้ได้สำหรับฉัน

บน DBeaver 6.0: ไปที่การตั้งค่าการเชื่อมต่อ> คุณสมบัติไดรเวอร์> โซนเวลาเซิร์ฟเวอร์> ตั้งค่า UTC

นอกจากนี้ในการกำหนดค่าบู๊ตสปริงต้องตั้งค่าคุณสมบัติด้านล่าง

JDBC: MySQL: // localhost: / serverTimezone = UTC


5

เห็นได้ชัดว่าในการรับไดรเวอร์ MySQL JDBC เวอร์ชัน 5.1.33 เพื่อทำงานกับเขตเวลา UTC ต้องระบุ serverTimezone อย่างชัดเจนในสตริงการเชื่อมต่อ

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

3

ฉันยังมีปัญหาเดียวกันที่แน่นอนใน LibreOffice Base ดังนั้นฉันเพิ่งระบุ 'เขตเวลาประหยัดเวลากลางวัน' ที่ไม่ใช่ในสตริงการเชื่อมต่อ
** ใส่คำอธิบายรูปภาพที่นี่ **

ฉันพยายามโดยไม่มี "& serverTimezone = MST" แต่ก็ล้มเหลวเช่นกัน

ฉันลอง "& serverTimezone = MDT" และล้มเหลวด้วยเหตุผลบางประการมันไม่ชอบเวลาออมแสง!


3

ฉันมีปัญหาเดียวกันเมื่อฉันพยายามที่จะทำงานกับโครงการบูตฤดูใบไม้ผลิบน windows

URL แหล่งข้อมูลควรเป็น:

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


3

เรียกใช้แบบสอบถามด้านล่างเพื่อ mysql DB เพื่อแก้ไขข้อผิดพลาด

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

ฉันมีข้อผิดพลาดคล้ายกับของคุณ แต่ค่าเขตเวลาของเซิร์ฟเวอร์คือ 'Afr ส่วนกลาง Ouest 'ดังนั้นฉันทำตามขั้นตอนเหล่านี้:

MyError (บน IntelliJ IDEA Community Edition):

    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) มันจะแก้ปัญหา

ป้อนรหัสต่อไปนี้ใน Mysql Workbench ของคุณและดำเนินการ quesry

[แหล่งลิงก์สำหรับคำถาม / ปัญหา]

[ลิงค์แหล่งที่มาสำหรับคำตอบ]

[ภาพหน้าจอโซลูชัน]


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

นี่เป็นวิธีแก้ปัญหานี้จริง ๆ แต่ไม่เพียงคัดลอกและวางไว้ในโปรแกรมของคุณ หากคุณเพียงแค่อ่านบรรทัดที่คุณจะพบ 'ผลลัพธ์' นั่นคือชื่อของฐานข้อมูลของฉันและคุณต้องเขียนของคุณ

มีองค์ประกอบสตริงสามส่วนส่วนแรกคือ URL ที่สองคือชื่อผู้ใช้และองค์ประกอบที่สามคือรหัสผ่าน ในวรรคข้างบนเราได้เคลียร์แล้ว url องค์ประกอบสตริงที่สองและสามตามที่ระบุชื่อผู้ใช้และรหัสผ่านของคุณคุณต้องเปลี่ยนตาม

ขอบคุณ


1

ฉันแก้ไขปัญหานี้โดยไม่ต้องเปลี่ยนรหัสใด ๆ เพียงแค่ไปที่การตั้งค่าเวลาของระบบและตั้งค่าโซนเวลา ในกรณีของฉันเขตเวลาเริ่มต้นคือ UTC ซึ่งฉันเปลี่ยนเป็นเขตเวลาท้องถิ่นของฉัน หลังจากที่ฉันได้เริ่มบริการทั้งหมดใหม่ทุกอย่างทำงานให้ฉัน


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");

1

ในกรณีของฉันมันเป็นสภาพแวดล้อมการทดสอบและฉันต้องสร้างแอปพลิเคชันที่มีอยู่ให้ทำงานโดยไม่มีการเปลี่ยนแปลงการกำหนดค่าและถ้าเป็นไปได้โดยไม่มีการเปลี่ยนแปลงการตั้งค่า MySQL ฉันสามารถแก้ไขปัญหาได้โดยทำตามคำแนะนำ @vinnyjames และเปลี่ยนเขตเวลาของเซิร์ฟเวอร์เป็น UTC :

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

การทำเช่นนั้นก็เพียงพอแล้วสำหรับฉันที่จะแก้ปัญหา


1

ฉันได้เพิ่มบรรทัดต่อไปนี้ใน/etc/mysql/my.cnfไฟล์ของฉัน:

default_time_zone='+00:00'

รีสตาร์ทเซิร์ฟเวอร์ MySQL:

systemctl restart mysql

และมันใช้งานได้เหมือนมีเสน่ห์


0

เห็นด้วยกับคำตอบ @bluecollarcoder แต่จะดีกว่าที่จะใช้TimeZone.getDefault().getID();ในตอนท้ายของสตริงการเชื่อมต่อ:

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

ในกรณีนี้Timezoneพารามิเตอร์จะอัปเดตโดยอัตโนมัติขึ้นอยู่กับเขตเวลาของเครื่อง


ไม่ถูกต้อง จุดของ useLegacyDatetimeCode = false ไม่จำเป็นต้องระบุ serverTimezone ดังนั้นไคลเอนต์แก้ไขเขตเวลาที่แตกต่างกัน
antgar9

0

เพียงแค่ปรับเปลี่ยนสตริงการเชื่อมต่อด้วยรหัสต่อไปนี้ในไฟล์ application.properties


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

0

ไม่มีผลกระทบของการตั้งค่าเวลาเซิร์ฟเวอร์เป็น UTC (ตัวอย่างเช่น jdbc:mysql://localhost:3306/myschema?serverTimezone=UTCแม้ว่าเซิร์ฟเวอร์แอปพลิเคชัน / ฐานข้อมูลของคุณไม่ได้อยู่ในเขตเวลานี้สิ่งสำคัญคือการเชื่อมต่อแอปพลิเคชันสตริง + ฐานข้อมูลจะซิงค์กับเขตเวลาเดียวกัน

กล่าวอีกนัยหนึ่งเพียงแค่ตั้งค่าserverTimezone=UTCด้วยเขตเวลาที่แตกต่างกันบนเซิร์ฟเวอร์ฐานข้อมูลจะเลื่อนวันที่ใด ๆ ที่ดึงมาจากฐานข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.