MySQL 5.6 DateTime Giá trị thời gian không chính xác: '2013-08-25T17: 00: 00 + 00: 00' với Mã lỗi 1292


15

Tôi đang sử dụng MySQL 5.6 và tôi có một chương trình chạy câu lệnh SQL sau đối với cơ sở dữ liệu của mình:

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

Không chính xác, tôi nhận được lỗi sau: Giá trị thời gian không chính xác: '2013-08-25T17: 00: 00 + 00: 00' cho cột 's_time' ở hàng 1

Kiểu dữ liệu cho s_time là DateTime.

Tôi đã cố gắng đặt thuộc tính allow_invalid_dates bằng bàn làm việc.

Bất cứ ai có thể hiểu và xin vui lòng giải thích lỗi này cho tôi? Tôi biết rằng nếu tôi thay đổi câu lệnh theo cách thủ công thành UPDATE m_tableSET s_time= '2013-08-25 17:00:00' WHERE id = '123', câu lệnh sẽ hoạt động.

Thật không may, tôi không thể sửa đổi chương trình cung cấp câu lệnh SQL (mà tôi đã nói là hợp lệ bởi người tạo ra chương trình) và tôi cũng không thể hiểu những gì mà biểu tượng: 00 tượng trưng.

Cảm ơn

Câu trả lời:


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

Đây là một giá trị thời gian iso-8601 hợp lệ , nhưng nó không phải là một giá trị thời gian của MySQL hợp lệ . Về điểm đó, nhà phát triển không chính xác.

Các tài liệu giải thích những gì ALLOW_INVALID_DATESkhông:

Chỉ kiểm tra xem tháng nằm trong phạm vi từ 1 đến 12 và ngày nằm trong phạm vi từ 1 đến 31.

Nói cách khác, 2013-02-31sẽ là một ngày cho phép nếu allow_invalid_datesđược đặt. Tùy chọn này không làm gì cả khi ngày hoặc thời gian không thậm chí ở định dạng hợp lệ cho MySQL.

Đây +00:00là phần bù múi giờ từ UTC . Trong trường hợp này, thời gian được biểu thị bằng UTC, do đó phần bù là 0 giờ, 0 phút.

Cách giải quyết của bạn sẽ là để loại bỏ các STRICT_TRANS_TABLEStừ sql_modeđó là một mặc định trong tập tin cấu hình được tạo ra trong quá trình cài đặt MySQL 5.6 ... bạn cần phải xem xét một cách cẩn thận những tác động của việc thay đổi này, nhưng nó không cho phép các dữ liệu để đi vào.

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)

Cảm ơn bạn. Cuối cùng tôi đã yêu cầu lập trình viên thay đổi mã PHP đã tạo ra câu lệnh SQL để đáp ứng tiêu chuẩn MySQL, nhưng đây là một cách giải quyết thú vị. Điều kỳ lạ là câu lệnh SQL gốc hoạt động trong các phiên bản MySQL cũ hơn.
Andrew

2
Bao gồm STRICT_TRANS_TABLEStrong tệp cấu hình mặc định chỉ được giới thiệu trong MySQL 5.6, giải thích sự thay đổi hành vi ... nếu bạn bật tính năng này SQL_MODEtrong các phiên bản trước, truy vấn cũng sẽ bị hỏng trong các phiên bản đó.
Michael - sqlbot

Bạn vừa cứu mạng tôi. Cảm ơn rất nhiều cho câu trả lời!
rafaels88
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.