MySQL 5.6 DateTime Yanlış datetime değeri: '2013-08-25T17: 00: 00 + 00: 00' Hata Kodu 1292 ile


15

MySQL 5.6 kullanıyorum ve veritabanım karşı aşağıdaki SQL deyimi çalışan bir program var:

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

Ne yazık ki, aşağıdaki hatayı alıyorum: Yanlış datetime değeri: satır 1'deki 's_time' sütunu için '2013-08-25T17: 00: 00 + 00: 00'

S_time için veri türü DateTime'dır.

Zaten tezgah kullanarak allow_invalid_dates özelliğini ayarlamaya çalıştım.

Bu hatayı bana anlayan ve açıklayan var mı? Ben deyimi manuel olarak GÜNCELLEME m_tableSET s_time= '2013-08-25 17:00:00' NEREDE id = '123' olarak değiştirirsem, ifadenin çalıştığını biliyorum.

Ne yazık ki, SQL deyimini sağlayan programı değiştiremiyorum (ki programın yaratıcısı tarafından geçerlidir) ve +00: 00'ın neyi sembolize ettiğini de anlayamıyorum.

Teşekkürler

Yanıtlar:


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

Bu geçerli bir iso-8601 datetime değeridir, ancak geçerli bir MySQL datetime değişmez değeri değildir . Bu noktada, geliştirici yanlıştır.

Dokümantasyon açıklıyor ALLOW_INVALID_DATESyapar:

Yalnızca ayın 1 ila 12 arasında ve günün 1 ila 31 arasında olduğunu kontrol edin.

Diğer bir deyişle, ayarlanmışsa 2013-02-31izin verilen bir tarih olur allow_invalid_dates. Bu seçenek, tarih veya tarih saat MySQL için geçerli bir biçimde olmadığında hiçbir şey yapmaz.

+00:00Dan ofset saat dilimidir UTC . Bu durumda, zaman olarak ifade içinde ofset sıfır saat, sıfır dakika yani, UTC.

Kişisel geçici çözüm kaldırmak olacağını STRICT_TRANS_TABLESdan sql_modeMySQL 5.6 yükleme işlemi sırasında oluşturulan yapılandırma dosyasında bir varsayılan olduğunu ... dikkatle bu değiştirmenin etkilerini dikkate almak gerekir, ancak veri gitmek için izin vermez.

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)

Teşekkür ederim. Sonunda programcıdan MySQL standardını karşılamak için SQL ifadesini oluşturan PHP kodunu değiştirmesini istedim, ama bu ilginç bir çözüm. Garip olan şey, orijinal SQL ifadesinin eski MySQL sürümlerinde çalışmasıdır.
Andrew

2
STRICT_TRANS_TABLESVarsayılan bir yapılandırma dosyasına dahil etmek , yalnızca davranış değişikliğini açıklayan MySQL 5.6'da tanıtıldı ... bunu SQL_MODEönceki sürümlerde etkinleştirirseniz , sorgu bu sürümlerde de bozulur.
Michael - sqlbot

Sadece hayatımı kurtardın. Cevabınız için çok teşekkürler!
rafaels88
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.