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_table
SET s_time
= '2013-08-25 17:00:00' WHERE id = '123'に変更すると、ステートメントが機能することを知っています。
残念ながら、SQLステートメントを提供するプログラム(プログラムの作成者によって有効であると言われています)を変更することはできません。また、+ 00:00が何を表すかを理解できません。
ありがとう
'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 [〜#〜] からのタイムゾーンオフセットです。この場合、表現される時間はinUTCなので、オフセットは0時間0分です。
回避策は、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)