MySQL 5.6 DateTime Nilai datetime salah: '2013-08-25T17: 00: 00 + 00: 00' dengan Kode Kesalahan 1292

15

Saya menggunakan MySQL 5.6 dan saya memiliki program yang menjalankan pernyataan SQL berikut terhadap database saya:

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

Tanpa sengaja, saya mendapatkan kesalahan berikut: Nilai datetime salah: '2013-08-25T17: 00: 00 + 00: 00' untuk kolom 's_time' di baris 1

Tipe data untuk s_time adalah DateTime.

Saya sudah mencoba untuk mengatur properti allow_invalid_dates menggunakan workbench.

Adakah yang bisa mengerti dan tolong jelaskan kesalahan ini kepada saya? Saya tahu bahwa jika saya mengubah pernyataan secara manual ke UPDATE m_tableSET s_time= '2013-08-25 17:00:00' WHERE id = '123', pernyataan itu berfungsi.

Sayangnya, saya tidak dapat memodifikasi program yang memasok pernyataan SQL (yang saya katakan valid oleh pembuat program) dan saya juga tidak dapat memahami apa yang melambangkan +00: 00.

Terima kasih

Andrew
sumber

Jawaban:

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

Ini adalah nilai dato iso-8601 yang valid , tetapi ini bukan dataman literal MySQL yang valid . Pada titik itu, pengembang salah.

The dokumentasi menjelaskan apa ALLOW_INVALID_DATESyang dilakukannya:

Pastikan hanya bahwa bulan berada dalam kisaran 1 hingga 12 dan hari tersebut dalam kisaran 1 hingga 31.

Dengan kata lain, 2013-02-31akan menjadi tanggal yang diizinkan jika allow_invalid_datesdiatur. Opsi ini tidak melakukan apa-apa ketika tanggal atau datetime bahkan tidak dalam format yang valid untuk MySQL.

Ini +00:00adalah offset zona waktu dari UTC . Dalam hal ini, waktu yang dinyatakan dalam UTC, jadi offsetnya adalah nol jam, nol menit.

Solusi Anda adalah menghapus STRICT_TRANS_TABLESdari sql_modeyang merupakan default di file konfigurasi yang dibuat selama proses instalasi MySQL 5.6 ... Anda perlu mempertimbangkan dengan cermat implikasi dari mengubah ini, tetapi itu memungkinkan data untuk masuk.

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)
Michael - sqlbot
sumber
Terima kasih. Pada akhirnya saya telah meminta programmer untuk mengubah kode PHP yang menciptakan pernyataan SQL untuk memenuhi standar MySQL, tetapi ini adalah solusi yang menarik. Yang aneh adalah bahwa pernyataan SQL asli berfungsi di versi MySQL yang lebih lama.
Andrew
2
Termasuk STRICT_TRANS_TABLESdalam file konfigurasi default hanya diperkenalkan di MySQL 5.6, yang menjelaskan perubahan perilaku ... jika Anda mengaktifkan ini SQL_MODEdi versi sebelumnya, kueri juga akan pecah di versi itu.
Michael - sqlbot
Anda baru saja menyelamatkan hidup saya. Terima kasih banyak atas jawabannya!
rafaels88