2013-07-11 5 views
22

Doctrine 1을 사용하는 앱이 있는데 을 통해 객체에 대해 update_datetime 필드를 생성합니다. 몇 년 동안 괜찮 았지만 이제는 새로운 노트가 생겼고 Doctrine은 DATETIME 필드를 "2013-07-12T03:00:00+07:00" 문자열로 삽입하려고합니다. 일반적인 MySQL datetime 형식 인 "2013-07-12 00:00:00"은 완전히 이상합니다.MYSQL의 DATETIME 형식이 올바르지 않습니다.

아주 똑같은 코드가 다른 컴퓨터에서 잘 돌아갑니다. 모든 것이 거의 동일합니다 - MySQL 5.6.12, PHP 5.3.15. 어떤 생각을해야할까요? StackOverflow의 커뮤니티의 도움으로 확인

Fatal error: Uncaught exception 'Doctrine_Connection_Mysql_Exception' with message 'SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2013-07-12T03:00:00+07:00' for column 'nextrun' at row 1' in library/Doctrine/Connection.php:1083

UPDATE

나는 마침내 그것을 해결했다. 문제는 STRICT_TRANS_TABLES으로 sql_mode 변수에 있습니다. 그러나 /etc/my.cnf에 변화가 충분하지 않은 듯, 그래서 나는 다음과 같은 mysql -uroot을 실행하고 입력했다 :

set sql_mode=NO_ENGINE_SUBSTITUTION; set global sql_mode=NO_ENGINE_SUBSTITUTION;

따라서 영원히 엄격한 제거하는 방법을 STRICT_TRANS_TABLES

UPDATE2 을 제거? 젠드에서 How to get rid of STRICT SQL mode in MySQL

+0

내가 하나의 시스템에'php.ini' 구성보고 싶은데 작동합니다. 뭔가가 기본 시간대를 설정했는데 다른 설정 시간대는 설정하지 않았다는 것을 알 수 있습니다. – Phil

+0

'date.timezone' 추가 - 동일. 다른 아이디어? – firedev

+0

PHP와 Mysql Server 버전 및 Mysql 클라이언트 라이브러리 버전 (및 유형)을 비교할 때 어떤 차이점이 있습니까? 이 문제를 분석하는 한 가지 방법은 동일한 구성이 있었으면 응용 프로그램이 동일하게 실행되므로 구성의 차이를 찾는 것입니다. * 거의 동일 함은 다를 수 있습니다. 예를 들어 하나의 서버가 후드 아래에서 mysqlnd를 사용합니까? – hakre

답변

12

존재하는 경우 my.ini에서 sql-mode에서 STRICT_TRANS_TABLES을 제거해보십시오.

mysql datetime으로 변환되지 않은 형식을 포함하는 datetime 문자열 값에이 오류가 발생할 수 있습니다. 이있는 my.ini 변화의 수정으로보고되었다 :

+0

오 마이 갓, 그게 다야! 고맙습니다! 그러나 어떻게? STRICT_TRANS_TABLES' 주어진 값을 트랜잭션 테이블에 삽입 할 수없는 경우 명령문을 중단하십시오. 비 트랜잭션 테이블의 경우, 값이 단일 행 명령문 또는 다중 행 명령문의 첫 번째 행에 있으면 명령문을 중단하십시오. 자세한 내용은이 섹션 뒷부분에 나와 있습니다. (MySQL 5.0.2에서 구현 됨) – firedev

+1

이것은 절반 만 수정되었지만, Zend 또는 Doctrine 내부에 런타임에이를 설정할 수있는 옵션이 있습니까? 나는 지금도 앱의 다른 부분에서 같은 문제를 발견했다. – firedev

2

날짜 상수는 내가 두 시스템 사이의 차이를 생각하고 서버 환경에 반영 될 것입니다 (zend_locale 의견을 형성)

1. Given Locale 
2. HTTP Client 
3. Server Environment 
4. Framework Standard 

순서로 로케일을 스니핑에서 결정된다.

나중에이 문제를 해결하고 이러한 구성 지시문을 사용하여 application.ini에서 로켈 옵션을 지정할 수 있습니다.

resources.locale.default = <DEFAULT_LOCALE> 
resources.locale.force = false 
resources.locale.registry_key = "Zend_Locale" 

로케일

는 Zend_Locale는 specificly setlocale 호출의 환경에서 로케일 및 결과 분석을 막 en_US

같은 문자열로 설정되어야한다.

+0

'Zend_Locale :: setDefault ('en_US')'가 충분하지 않아야합니까? – firedev

+1

만약 내 가정이 올바른 것이었다면 ... 내가 계속 파고들 것이다. 호기심에서 어떤 OS를 사용하고 있는지, 가능한 경우 커맨드 라인에서'locale'을 실행하면'LC_TIME'을 얻는다. 리눅스 및 Mac에서 사용 가능) – Orangepill

+1

문제는 Mac OS 10.8.9에서 로켈 출력입니다 :'LC_TIME = "en_GB.UTF-8"'동일한 컴퓨터가 작동하는 다른 컴퓨터에서도 마찬가지입니다. 내가 볼 수있는 한 모든 것이 동일합니다. – firedev

1

이것은 젠드는 MySQL이 기대 것과 일치 하나에 타임 스탬프 형식을 설정하지 않음으로써 발생합니다. MySQL에서 STRICT 모드를 비활성화 할 수 있지만 해킹이며 솔루션이 아닙니다 (MySQL은 입력 한 날짜를 추측합니다).나는 마침내 그것을 해결 StackOverflow의 커뮤니티의 도움으로

$log = new Zend_Log(); 
$log->setTimestampFormat("Y-m-d H:i:s"); 
+0

이것은 로그에 설정합니다 ... 모든 곳에서 아닙니다. – Orangepill

+0

확실히 @Orangepill은 타임 스탬프 형식을 설정하는 방법의 예입니다. 불행히도 Zend는 전 세계적으로 그것을 설정하는 방법을 알기에 충분히 익숙하지 않습니다. – Developer

+0

Zend_Locale에 있습니다 ... 이미 그 나무를 짖었습니다. getIso는 로케일 설정과 동일한 스타일 타임 스탬프를 만듭니다. 하 크레가 뭔가 있을지도 몰라. 환경을 제외하고 모든 것이 동일하다면 문제는 구성의 차이가되어야합니다. – Orangepill

0

확인 :

젠드에서 당신은 MySQL이이 문제를 해결하기 위해 기대하고 무엇에 날짜 형식을 설정할 수 있습니다. 문제는 sql_mode 변수에서 STRICT_TRANS_TABLES와 함께 발생했습니다. 그러나 /etc/my.cnf에서 그것을 변경하는 것만으로는 충분하지 않으므로 mysql -uroot을 실행하고 다음을 입력해야합니다.

set sql_mode = NO_ENGINE_SUBSTITUTION; 전역 설정 sql_mode = NO_ENGINE_SUBSTITUTION; 따라서

STRICT_TRANS_TABLES

을 제거

------이 대답은

관련 문제