MySQL 5.6 DateTime不正な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' 

残念ながら、次のエラーが表示されます。不正な日時値:行1の列 's_time'の '2013-08-25T17:00:00 + 00:00'

s_timeのデータ型はDateTimeです。

ワークベンチを使用してallow_invalid_datesプロパティを設定しようとしました。

誰でもこのエラーを理解して説明してもらえますか?ステートメントを手動で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日時リテラルではありません。その点で、開発者は間違っています。

ドキュメントには、どのような説明ALLOW_INVALID_DATESを行います。

月が1〜12の範囲にあり、日が1〜31の範囲にあることのみを確認してください。

つまり、設定されて2013-02-31いる場合、許容される日付になりますallow_invalid_dates。このオプションは、日付または日付時刻がMySQLの有効な形式でなくても何もしません。

+00:00以下からのオフセットタイムゾーンであるUTC。この場合、時間が発現オフセットゼロ時間、ゼロ分になるように、UTC。

あなたの回避策は、MySQL 5.6のインストールプロセス中に作成された設定ファイルのデフォルトSTRICT_TRANS_TABLESから削除するsql_modeことです...これを変更することの影響を慎重に検討する必要がありますが、データを許可します。

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)

ありがとうございました。最後に、SQLステートメントを作成したPHPコードをMySQL標準に合わせて変更するようプログラマーに依頼しましたが、これは興味深い回避策です。奇妙なことは、元のSQLステートメントが古いMySQLバージョンで機能することです。
アンドリュー

2
STRICT_TRANS_TABLESデフォルトの設定ファイルに含めることはMySQL 5.6でのみ導入され、動作の変更について説明しています... SQL_MODE以前のバージョンでこれを有効にすると、これらのバージョンでもクエリが壊れます。
マイケル-sqlbot

あなたは私の命を救っただけです。答えてくれてありがとう!
rafaels88 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.