2013-02-19 5 views
2

현재 Linux 프로덕션 서버에만 배포 된 기존 응용 프로그램을 변경하라는 요청을 받았습니다. 필자는 로컬 Windows PC에서 대부분의 응용 프로그램을 사용하도록했습니다. 로컬 PC에 Production의 MySQL DB의 전체 사본이 설치되어 있습니다. Linux의 Production DB는 MySQL v5.0.95이고 Windows의 로컬 DB는 MySQL v5.5입니다. 둘 다 InnoDB 모드에있다.MySQL 오류 코드 : 1411. str_to_date 함수에 대해 잘못된 datetime 값 : ''

제 문제는 다음과 같은 내용입니다. 도움을 청하는 사람들이 쉽게 사용할 수 있도록 일반용으로 제작되었습니다. 생산에 문제가 발생하여 레코드를 갱신/저장할 수 있지만 로컬이 SQLException가 발생 할 수 있습니다하지 않는 빈 문자열이 전달되는 경우에

update atable 
set adate=DATE_ADD(str_to_date('','%m/%d/%Y'), INTERVAL 0 DAY) 
where anum='1' 

. 그래서 내 로컬 DB에 대해 SQL 문을 직접 시도하고 두 경우 모두 다음과 같은 오류 메시지가 나타납니다.

오류 코드 : 1411 잘못된 날짜 시간 값 : 모든 주요 차이점을 찾고 내가 생산 my.cnf을 검토 한

기능 STR_TO_DATE 내 지역 my.ini을 위해 ''나는 또한에 시도 로컬에서는 SQL 모드 "ALLOW_INVALID_DATES"을 사용하지만 최종 결과는 변경되지 않았습니다.

이 빈 문자열을 전달하지 않도록 코드를 변경할 수 있음을 알고 있지만이 경우 많은 문이 있으며 가능하면이 모든 것을 변경하고 싶지 않습니다. 이 고객에게는 제한된 예산과 일정이 있으므로 새로운 요구 사항에 중점을두고 싶습니다. 가능하다면 Production에서와 같이 로컬 환경을 어떻게 작동시킬 수 있는지에 대한 의견을 찾고 있습니다.

감사합니다.

+1

'' ''은 (는) 유효한 날짜가 아닙니다. 어떤 날짜를 추가해야합니까? 현재 날짜? –

+0

아니요, 로컬 및 프로덕션 모두에서 빈 문자열로 전달됩니다. 나는 그것이 이상하다는 것을 안다. 그리고 나는 그것이 생산에서 어떻게 작동 하는지를 잘 모르고있다. 그러나 그것은 그렇다. – ItBHarsH

답변

5

SQLException은 MySQL에서 직접 가져온 것이 아니며 클라이언트 언어에 의해 트리거되었을 수 있습니다. MySQL은 정상적으로 무시할 수있는 경고를 생성합니다.

경고 :

mysql> SET @@SESSION.sql_mode='NO_ZERO_DATE,NO_ZERO_IN_DATE'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into test (date_created) VALUES (str_to_date('','%m/%d/%Y')); 
Query OK, 1 row affected, 1 warning (0.01 sec) 

mysql> show warnings; 
+---------+------+-------------------------------------------------------+ 
| Level | Code | Message            | 
+---------+------+-------------------------------------------------------+ 
| Warning | 1411 | Incorrect datetime value: '' for function str_to_date | 
+---------+------+-------------------------------------------------------+ 
1 row in set (0.00 sec) 

없음 경고 :

mysql> SET @@SESSION.sql_mode='ALLOW_INVALID_DATES'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into test (date_created) VALUES (str_to_date('','%m/%d/%Y')); 
Query OK, 1 row affected (0.03 sec) 

편집 : 당신이 방법을 찾고 있다면이 재 작성하지 않으려면 무엇이든의 ALLOW_INVALID_DATES SQL 모드 실제로 트릭을 할해야 쿼리를 사용하면 다음과 같이 시도 할 수 있습니다.

update atable 
set adate=NULL 
where anum='1' 

물론이 경우 adate이 Null을 허용해야합니다.

+0

내가 명확하지 않으면 죄송합니다. MySQL Workbench의 쿼리 창에서 쿼리를 실행할 때와 동일한 오류를보고하는 코드에서 SQLException이 발생합니다. 다음 출력은 MySQL Workbench 질의 창에서 직접 내 코드 외부에서 원시 쿼리를 실행할 때 얻은 결과입니다. 'ACTION : 업데이트 세트 adate = DATE_ADD (STR_TO_DATE ('xxx'가, '%의 m/% D/% Y') INTERVAL 0 DAY) ATABLE 여기서 anum에 = '1' 메시지 : 오류 코드 : 1411 . 잘못된 날짜 시간 값 : ''for str_to_date function my.ini에서 'ALLOW_INVALID_DATES'모드를 사용하거나 사용하지 않아도이 문제가 발생합니다. – ItBHarsH

+0

그래서 코드와 Workbench 모두 경고를 경고로보고합니다. 원하는 답을 모를 경우 SQL 모드를 해제하여 기본 경고를 피하거나 쿼리를 변경할 수 있습니다. 그것은 기본적으로 모두입니다. –

+0

언급 한대로 ALLOW_INVALID_DATES 모드를 시도했지만 도움이되지 않았습니다. 프로덕션 서버에는 정의 된 모드가 없습니다. 나는 SQL 모드 문서를보고 있었고 시도 할 다른 옵션이 무엇인지 알지 못했다. 제안? --- BTW 귀하의 모든 의견에 감사드립니다! – ItBHarsH