오류 메시지가 서버가 아닌 MySQL 클라이언트에서 오는 것 같습니다. 따라서 서버 엄격 모드를 설정하면이 클라이언트에이 날짜를 표시하는 데 도움이되지 않습니다.
데이터에 2012-09-31 또는 2013-02-29 스타일 날짜가있는 것으로 보입니다. 그것들은 올바르게 포맷되었지만 틀린 것들입니다. 5.0.2 이전 버전의 MySQL에서는 이러한 정보가 데이터에 올바르게 반영되지 않습니다. 이제 서버가 ALLOW_INVALID_DATES
으로 설정되었지만 서버가 '0000-00-00'으로 변환됩니다. 그리고 고객이 그들을 공격하고 있습니다.
이 작업을 정리하는 첫 번째 단계는 문제가되는 행을 식별하는 것입니다. 너는 이것을 시도 할 수있다.
먼저, 그 다음 ALLOW_INVALID_DATES
켜 테이블에 주위를 둘러 보면이 쿼리를 실행합니다. 날짜는 쓰레기입니다 결과 집합에서 파악하는 SELECT *
SELECT col,col,col,DATE_FORMAT(datecol,'%Y-%m-%d')
FROM mytable
ORDER BY DATE_FORMAT(datecol,'%Y-%m-%d')
시도를 사용하지 마십시오. 이것들은이 select 문에 우선 배치 될 수 있지만, 당신은 그들을 찾기 위해 조금 주위를 돌봐야 할 것입니다.
다음으로 수정 방법을 알아보십시오. 행을 삭제 하시겠습니까? 날짜를 1941-12-07 (악명 높은 곳에 사는 날짜)로 변경 하시겠습니까? 여기서해야 할 일은 말할 수 없습니다.
그런 다음 수정하십시오. 하나 또는 두 개만 있으면 하나씩 수정하십시오.
UPDATE mytable
SET datecol='whatever replacement date'
WHERE id='the id of the offending row.'
또는
DELETE FROM mytable
WHERE id='the id of the offending row.'
그들의 수천이있는 경우
, 당신은 대량 이런 식으로 뭔가로 고정 할 수있다.
하지만 먼저 테스트 서버에서 문제를 매우 조심스럽게 다루지 않으면이 작업을 수행하지 마십시오. 실수하면 테이블을 휴지통에 버릴 것입니다. 당신이 당신의 문제를 해결하는 마친 후
UPDATE mytable
SET datecol='whatever replacement date'
WHERE '0000-00-00' = DATE_FORMAT(datecol,'%Y-%m-%d')
, 당신이 그들 모두를 가지고 있는지 확인하려면 SELECT *
돌아가서 않습니다.
그런 다음 ALLOW_INVALID_DATES
을 비활성화하고 다시 사용하지 마십시오.
엉망을 정리해야합니다. 실제 데이터는 항상 완벽하지 않은 일부 행에 주목하십시오.
@OlafDietsche 아니요, 그렇지 않습니다. 이 질문은 잘못된 날짜를 변환하는 방법을 묻습니다. 그 질문은 잘못된 날짜를 허용하는 방법을 묻습니다. 완전히 다른 질문들. 그건 그렇고, 당신의 유일한 입력입니까? 질문을 잘못보고 했습니까? –