convert_tz คืนค่า null


98

ฉันรู้ว่ามันฟังดูโง่ แต่เมื่อฉันใช้

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta') AS time

ส่งออกเป็น NULL ฉันใช้ MySQL Workbench ใน Ubuntu 12.04 64 บิตและใช้งานได้กับแล็ปท็อป / ระบบปฏิบัติการอื่นของฉัน (ใช้ MySQL Workbench ด้วย)

คำตอบ:


188

สิ่งนี้จะเกิดขึ้นหากคุณไม่ได้โหลดตารางโซนเวลาลงใน mysql

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

mysql คือชื่อของฐานข้อมูลในตัวที่เก็บข้อมูลการกำหนดค่าเฉพาะ MySQL


1
คุณต้องทำเพียงครั้งเดียวหรือทุกครั้งที่ MySql เริ่มทำงาน?
Abe Miessler

3
เพียงครั้งเดียว. โหลดข้อมูลลงในตารางลงใน MySQL ซึ่งจะใช้ต่อจากนั้น
Barmar

2
คุณสามารถใช้แฟล็กบังคับเพื่อลบล้างข้อผิดพลาดที่คุณพบได้เช่นกัน: mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root --force -p mysql
scum

3
ฉันต้องรีสตาร์ท MySQL daemon ด้วยก่อนที่มันจะมีผลบังคับใช้ (บน Debian)
Ekster

3
สวัสดีเมื่อฉันเรียกใช้คำสั่งนี้ฉันพบข้อผิดพลาดดังนี้คำเตือน: ไม่สามารถโหลด '/usr/share/zoneinfo/iso3166.tab' เป็นเขตเวลาได้ ข้ามมันไป คำเตือน: ไม่สามารถโหลด '/usr/share/zoneinfo/zone.tab' เป็นเขตเวลาได้ ข้ามมันไป
Ghanshyam Katriya

26

ฉันพบเธรดนี้หลังจากใช้เวลาพยายามหาสาเหตุหลังจากรันคำสั่งในคำตอบที่ยอมรับ (ซึ่งเหมือนกันในไซต์ dev ของ MySQL) คำสั่งไม่สามารถแปลงระหว่างเขตเวลาเช่น

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','MET') AS time

ปรากฎว่าบน OS X มีสองไฟล์ที่ทำให้เกิดปัญหา: /usr/share/zoneinfo/Factoryและ/usr/share/zoneinfo/+VERSION.

การแก้ไข ... ย้ายไฟล์เหล่านี้ไปยังตำแหน่งอื่นชั่วคราวเช่น/usr/share/zoneinfo/.bak/อนุญาตให้ใช้คำสั่ง

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

เพื่อเติมเต็มข้อมูลเขตเวลาที่คาดไว้ทั้งหมด

นี่อาจเป็นหรือไม่เป็นข้อผิดพลาดใน MySQL เวอร์ชันที่ติดตั้งของฉัน:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.11, for osx10.6 (x86_64) using  EditLine wrapper

STRICT_MODEนอกจากนี้ผมยังดำเนินงานใน

ไม่ว่าในกรณีใดฉันหวังว่าสิ่งนี้จะช่วยลดอาการปวดหัวสำหรับทุกคนที่ค้นหาวิธีแก้ไข


13

นอกเหนือจากสภาพแวดล้อมของ Windows คุณสามารถตั้งค่าโซนเวลาโดย

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

ในสภาพแวดล้อมWindows

1. download Time zone description tables from http://dev.mysql.com/downloads/timezones.html

2. Stop MySQL server

3. Put then inside Mysql installation package (เช่น C: \ Program Files \ MySQL \ data \ mysql) "

4. Start MySQL server

.. งานเสร็จแล้ว ..

หากยังคงคุณจะได้รับNULLสำหรับการCONVERT_TZ ดาวน์โหลดตารางฐานข้อมูลเหล่านี้และใส่ลงในฐานข้อมูล mysql http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html

ตอนนี้ปัญหาของคุณจะได้รับการแก้ไข .. :)


2

หากคุณใช้ MySql บน Windows คุณต้องโหลดข้อมูลเขตเวลาลงในสคีมา mysql นี่คือ HOWTO ที่ดี: http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

หากคุณไม่ทำเช่นนี้ฟังก์ชัน CONVERT_TZ จะไม่รู้จักเขตเวลาป้อนข้อมูลของคุณ (เช่นตัวอย่างของคุณ: 'UTC', 'Asia / Jakarta') และจะส่งคืนค่า NULL


2

MAMP PRO

  1. เปิด Terminal
  2. cd /usr/share/zoneinfo/
  3. sudo mv +VERSION ~/Desktop
  4. cd /applications/MAMP/Library/bin
  5. sudo ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -p -u root mysql
  6. sudo mv ~/Desktop/+VERSION /usr/share/zoneinfo/

นอกเหนือจากตำแหน่งของโฟลเดอร์ไบนารีแล้วสิ่งนี้ใช้กับ macOS โดยทั่วไป ขอบคุณ!
พันคลิก

2

1) ใน Windows ตอนนี้ไม่มีโฟลเดอร์ข้อมูลอยู่C:\Program Files\MySQL\ในคำตอบอื่น ๆ

2) C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysqlในกรณีที่มองหา โดยทั่วไปโฟลเดอร์นี้จะซ่อนอยู่และคุณจะไม่เห็นC:\ProgramData\บางครั้ง

3) เปลี่ยนแท็บการตั้งค่าในมุมมองเพื่อดูไฟล์และโฟลเดอร์ที่ซ่อนอยู่ตามที่อธิบายไว้ที่นี่https://irch.info/index.php?pg=kb.page&id=133

4) หยุดบริการ MySQL โดยค้นหา "services" ในปุ่ม Start ของ Windows

5) จากนั้นคลายซิป timezone_2017c_posix.zip แล้วคัดลอกไฟล์ในนั้น (คัดลอกไฟล์โดยตรงอย่าคัดลอกทั้งโฟลเดอร์เอง) และวาง C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\

6) สำหรับ MySQL 5.7 timezone_2017c_posix.zip จะให้ไฟล์. sql หลังจากคลายซิปและอาจไม่สามารถแก้ปัญหาได้ ไปข้างหน้าและดาวน์โหลดไฟล์ zip สำหรับ 5.6 แม้ว่าคุณจะเรียกใช้ MySQL 5.7 และคัดลอกไฟล์เหล่านั้นไปยังไฟล์C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql\

7) รีสตาร์ทเซิร์ฟเวอร์ MySQL หากต้องการตรวจสอบว่า CONVERT_TZ () ใช้งานได้หรือไม่ให้เรียกใช้แบบสอบถาม sql นี้

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta'); และตรวจสอบเอาต์พุตที่ไม่ใช่ค่าว่าง


1
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

หากคุณได้รับข้อผิดพลาดdata too long for column 'abbreviation' at row 1 โปรดดู: https://bugs.mysql.com/bug.php?id=68861

การแก้ไขจะเรียกใช้สิ่งต่อไปนี้

สิ่งนี้จะเพิ่มบรรทัดเพื่อปิดใช้งานโหมด mysql และอนุญาตให้ mysql แทรกข้อมูลที่ถูกตัดทอนซึ่งเป็นเพราะจุดบกพร่องของ mysql ที่ mysql จะเพิ่มอักขระ null ในตอนท้าย (ตามลิงค์ด้านบน)

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql

echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql

mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql

ฉันมี OSX El Capitan และนี่คือคำตอบเดียวที่จะทำให้มันใช้งานได้ สำหรับการอ้างอิงในอนาคต: ในกรณีของฉันสถานะข้อผิดพลาด: "ข้อมูลยาวเกินไปสำหรับคอลัมน์ 'ตัวย่อ' ที่แถว 1" หมายเหตุ: ความพยายามทั้งหมดที่จะทำ (sudo) mkdir หรือ (sudo) mv ของแฟ้มที่ระบุไว้ในคำตอบอื่น ๆ ส่งผลให้ 'ปฏิเสธการอนุญาต'
hepabolu

BTW ฉันไม่จำเป็นต้องรีสตาร์ท MySQL
hepabolu

1

นี่คือขั้นตอนที่จะทำให้มันใช้งานได้หากคุณอยู่ใน windows และใช้ MySQL 5.7

  1. คลิกขวาที่ My Computer / Computer / PC นี้หรือชื่ออะไรก็ได้ใน OS ของคุณแล้วเลือก Properties
  2. เลือก "การตั้งค่าระบบขั้นสูง" จากแผงด้านซ้าย
  3. เลือก "ตัวแปรสภาพแวดล้อม" ป้อนชื่อพา ธ ที่สมบูรณ์ของไดเร็กทอรี MySQL bin ของคุณ (โดยทั่วไปจะอยู่ใน C: \ Program Files \ MySQL \ MySQL Server 5.7 \ bin)
  4. เปิด cmd พรอมต์ใส่ลงไปใน MySQL mysql -u root -p passwordใช้
  5. เข้าไปuse mysqlเพื่อเลือก MySQL DB
  6. ดาวน์โหลดไฟล์ "timezone_YYYYc_posix_sql.zip" (การในสถานที่ของปปปปที่ใช้แทนปีสูงสุดที่มีอยู่ในหน้านั้นเช่น 2017 หรือ 2018) จากhttps://dev.mysql.com/downloads/timezones.html
  7. แตกไฟล์และเปิดไฟล์ในโปรแกรมแก้ไขข้อความ
  8. คัดลอกเนื้อหาและดำเนินการในพรอมต์ cmd

เมื่อทำสำเร็จคุณจะสามารถใช้CONVERT_TZและฟังก์ชันเขตเวลาอื่น ๆ ได้


0

บน Mac OS Catalina เมื่อใช้ XAMPP

ไปที่โฟลเดอร์ / Applications / XAMPP / xamppfiles / bin ใน Terminal จากนั้นเรียกใช้ดังต่อไปนี้

./mysql_tzinfo_to_sql / usr / share / zoneinfo | ต้องตั้งค่า sed -e "s / เขตเวลาท้องถิ่น - ดูหน้าคู่มือ zic / local /" | ./mysql -u root mysql

สิ่งนี้ได้ผลสำหรับฉัน

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