MySQL 5.6 DateTime ค่าวันที่และเวลาไม่ถูกต้อง: '2013-08-25T17: 00: 00 + 00: 00' พร้อมรหัสข้อผิดพลาด 1292


15

ฉันใช้ MySQL 5.6 และฉันมีโปรแกรมที่รันคำสั่ง SQL ต่อไปนี้กับฐานข้อมูลของฉัน:

UPDATE `m_table` SET `s_time` = '2013-08-25T17:00:00+00:00' WHERE id = '123' 

ไม่ได้รับการแจ้งเตือนฉันได้รับข้อผิดพลาดต่อไปนี้: ค่าวันที่และเวลาไม่ถูกต้อง: '2013-08-25T17: 00: 00 + 00: 00' สำหรับคอลัมน์ 's_time' ที่แถว 1

ประเภทข้อมูลสำหรับ s_time คือ DateTime

ฉันพยายามตั้งค่าคุณสมบัติ allow_invalid_dates โดยใช้ workbench แล้ว

ทุกคนสามารถเข้าใจและโปรดอธิบายข้อผิดพลาดนี้ให้ฉันได้ไหม ฉันรู้ว่าถ้าฉันเปลี่ยนคำสั่งเป็น UPDATE m_tableSET s_time= '2013-08-25 17:00:00' WHERE id = '123' คำสั่งนั้นจะทำงาน

น่าเสียดายที่ฉันไม่สามารถปรับเปลี่ยนโปรแกรมที่ให้คำสั่ง SQL (ซึ่งฉันบอกว่าถูกต้องโดยผู้สร้างโปรแกรม) และฉันก็ไม่เข้าใจว่าเครื่องหมาย +00: 00 เป็นอย่างไร

ขอบคุณ

คำตอบ:


24
'2013-08-25T17:00:00+00:00'

นี้เป็นที่ถูกต้องISO-8601คุ้มค่าวันที่และเวลา แต่มันไม่ได้เป็นที่ถูกต้องMySQL datetime อักษร ในจุดนั้นผู้พัฒนาไม่ถูกต้อง

เอกสารอธิบายถึงสิ่งที่ALLOW_INVALID_DATESไม่:

ตรวจสอบเฉพาะเดือนที่อยู่ในช่วงตั้งแต่ 1 ถึง 12 และวันอยู่ในช่วงตั้งแต่ 1 ถึง 31

กล่าวอีกนัยหนึ่ง2013-02-31จะเป็นวันที่ที่อนุญาตถ้าallow_invalid_datesตั้งไว้ ตัวเลือกนี้ไม่ได้ทำอะไรเลยเมื่อวันที่หรือวันที่และเวลาไม่ได้อยู่ในรูปแบบที่ถูกต้องสำหรับ MySQL

+00:00เป็นเขตเวลาชดเชยจากUTC ในกรณีนี้เวลาที่แสดงเป็นใน UTC เพื่อชดเชยเป็นศูนย์ชั่วโมงศูนย์นาที

วิธีแก้ปัญหาของคุณจะเอาSTRICT_TRANS_TABLESจากsql_modeที่เป็นค่าเริ่มต้นในไฟล์ config ที่สร้างขึ้นในระหว่างขั้นตอนการติดตั้ง MySQL 5.6 ... คุณต้องพิจารณาอย่างรอบคอบถึงผลกระทบของการเปลี่ยนแปลงนี้ แต่มันไม่ช่วยให้ข้อมูลที่จะไปใน

mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into datetimetest(dt) values ('2013-08-26T12:00:00+00:00');
ERROR 1292 (22007): Incorrect datetime value: '2013-08-26T12:00:00+00:00' for column 'dt' at row 1

-- remove STRICT_TRANS_TABLES -- note that executing this only removes it for your
-- current session -- it does not make a server-wide config change

mysql> set @@sql_mode='no_engine_substitution';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode;
+------------------------+
| @@sql_mode             |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)

-- now MySQL will accept the invalid value, with a warning

mysql> insert into datetimetest(dt) values ('2013-08-26T12:00:00+00:00');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------+
| Level   | Code | Message                                 |
+---------+------+-----------------------------------------+
| Warning | 1265 | Data truncated for column 'dt' at row 1 |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)

-- the value did get inserted, but the time zone information was lost:

mysql> select * from datetimetest;
+----+---------------------+
| id | dt                  |
+----+---------------------+
|  1 | 2013-08-26 12:00:00 |
+----+---------------------+
1 row in set (0.00 sec)

ขอขอบคุณ. ในที่สุดฉันได้ขอให้โปรแกรมเมอร์เปลี่ยนรหัส PHP ที่สร้างคำสั่ง SQL เพื่อให้เป็นไปตามมาตรฐาน MySQL แต่นี่เป็นวิธีแก้ปัญหาที่น่าสนใจ สิ่งที่แปลกก็คือคำสั่ง SQL ดั้งเดิมทำงานใน MySQL รุ่นเก่ากว่า
แอนดรู

2
การรวมSTRICT_TRANS_TABLESในไฟล์การกำหนดค่าเริ่มต้นนั้นมีเฉพาะใน MySQL 5.6 เท่านั้นซึ่งจะอธิบายการเปลี่ยนแปลงพฤติกรรม ... หากคุณเปิดใช้งานสิ่งนี้SQL_MODEในรุ่นก่อนหน้าแบบสอบถามจะแตกในเวอร์ชันเหล่านั้นด้วย
Michael - sqlbot

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