MySQL 5.6 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_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)

감사합니다. 결국 프로그래머에게 MySQL 표준을 충족시키기 위해 SQL 문을 만든 PHP 코드를 변경하도록 요청했지만 이는 흥미로운 해결 방법입니다. 이상한 점은 원래 SQL 문이 이전 MySQL 버전에서 작동한다는 것입니다.
Andrew

2
STRICT_TRANS_TABLES기본 구성 파일을 포함하면 MySQL 5.6에만 도입되었으며 동작 변경에 대해 설명합니다 ... SQL_MODE이전 버전 에서이 기능을 활성화하면 해당 버전에서도 쿼리가 중단됩니다.
Michael-sqlbot

당신은 내 생명을 구했습니다. 답변 주셔서 감사합니다!
rafaels88
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.