2012-10-17 3 views
4

테이블에 잘못된 날짜가 있습니다. 엄격한 모드를 비활성화하거나 sql_mode ALLOW_INVALID_DATES를 사용할 수 없다는 소식을 들었습니다. select @@ global.sql_mode로 확인하고 서버를 다시 시작한 것으로 확인되었습니다.mysql이 유효하지 않은 날짜를 수정했습니다.

제 질문은 '잘못된'날짜를 수정할 수 없습니까? 모든 서버에서 엄격 모드를 비활성화 할 수는 없습니다.

select * from table 
>> Mysql2::Error: Invalid date: 1900-00-00 

mysql --version 
mysql Ver 14.14 Distrib 5.1.61, for debian-linux-gnu (i686) using readline 6.1 

mysql> select @@global.sql_mode; 
+---------------------+ 
| @@global.sql_mode | 
+---------------------+ 
| ALLOW_INVALID_DATES | 
+0

@OlafDietsche 아니요, 그렇지 않습니다. 이 질문은 잘못된 날짜를 변환하는 방법을 묻습니다. 그 질문은 잘못된 날짜를 허용하는 방법을 묻습니다. 완전히 다른 질문들. 그건 그렇고, 당신의 유일한 입력입니까? 질문을 잘못보고 했습니까? –

답변

5

오류 메시지가 서버가 아닌 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을 비활성화하고 다시 사용하지 마십시오.

엉망을 정리해야합니다. 실제 데이터는 항상 완벽하지 않은 일부 행에 주목하십시오.

+0

대단히 감사합니다. 이 가이드를 사용하여 문제를 해결하려고합니다. –