MySQL 5.6 DateTime 잘못된 날짜 시간 값 : ‘2013-08-25T17 : 00 : 00 + 00 : 00’오류 코드 1292 ‘123’ 불행히도 다음과 같은 오류가 발생합니다. 1

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의 상징을 이해할 수 없습니다.

감사



답변

'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_TABLESsql_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)