SQL Server PHP 드라이버에 날짜 / 시간 형식을 설정하는 방법


1

내 PHP 스크립트에서 MS SQL Server의 열 (datetime 유형)에 날짜를 추가하고 싶습니다. 이 블로그 게시물 (php5-sybase, php5-odbc, 우분투 14.04 / 15.10의 freetds)에 따라 연결을 설정했습니다 : https://blog.thesysadmins.co.uk/ubuntu-server-connect-to-mssql-via- php.html

내 문제는 SQL Management Studio와 동일한 PHP 스크립트에서 동일한 쿼리를 사용하면 날짜 열이 NULL로 해석되기 때문에 PHP를 통한 쿼리가 실패한다는 것입니다. (축약 된) 쿼리 :

INSERT INTO tbl_test (mydate) VALUES (’20-3-2004′)
message: Cannot insert the value NULL into column ‘mydate’ column does not allow nulls. INSERT fails.

내가 말했듯이 SQL Management Studio에서 정확히 동일한 쿼리가 제대로 실행됩니다. 이제이 쿼리는 오류없이 실행됩니다.

INSERT INTO tbl_test (mydate) VALUES (’3-20-2004′)

분명히 쿼리의 날짜 시간은 MDY 로 해석 되지만 변경할 수있는 옵션을 찾을 수 없습니다. 놀랍게도 우분투 15.10에서는 작동하지만 14.04에서는 아파치 php와 동일한 구성을 사용합니다. freetds와 php5-odbc는 기본값을 사용합니다.

SQL Server 설정 (@@ LANGUAGE = Germand, sp_helplanguage 독일어 dateformat = dmy) 또는 php.ini (iconv 날짜 시간 형식) 모두 MDY를 구성 하지 않았습니다 . mssql.datetimeconvert = 켜짐 은 꺼짐과 차이가 없습니다.

tl; dr PHP에게 날짜 시간 형식이 MDY가 아니라 DMY인지 어떻게 알 수 있습니까?


당신은 세기 (YYYY)와 세기 (전년 동기 대비)이없는 날짜 스타일의 3 (103)) (변환 사용을 시도 할 수 - 참조 msdn.microsoft.com/en-us/library/ms187928.aspx
크리스 로저스

그렇습니다. 그러나 그것은 해결 방법 일뿐입니다 (적어도 나를 위해). 아니면 쿼리의 모든 날짜를 명시 적으로 변환하는 것이 가장 좋은 방법입니까? MSSQL 전문가가 아니기 때문에 진정으로 묻습니다.
NoMad

답변:


1

근본 원인은 PHP 나 freetds 또는 * NIX 시스템 설정이 아닙니다. /etc/freetds/locales.conf날짜 / 시간 형식을 설정하기 위해 잘 문서화 되어 있습니다.

그러나 FREETDS 드라이버가 지정된 형식으로 날짜를 해석하기 위해 쿼리에 문자열로 문자를 인코딩해서는 안됩니다.

위의 질문에서 볼 수 있듯이 datetime 유형의 필드 값 은 작은 따옴표 / 틱으로 묶습니다. 이런 식으로 FreeTDS는 데이터를 문자열 (정확하게는 varchar)로 해석하고 SQL Server에 전달합니다. SQL-Server에서 varchars를 datetime 열에 삽입 할 수 없기 때문에 쿼리가 실패하는 이유입니다.

정확히 동일한 쿼리가 한 버전의 Ubuntu에서 작동했지만 다른 버전은 작동하지 않습니다.

tl; dr 쿼리에서 날짜 시간 값을 따옴표로 묶지 마십시오. 3 개월 만에 깨달았습니다. :)


0

의견에서 지적했듯이 convert () 를 사용하는 것이 해결 방법입니다. 저는 MS SQL 전문가가 아닙니다. 나는 주로 MySQL을 사용합니다. 그러나 MS SQL 날짜 시간 은 형식을 사용합니다.yyyy-mm-dd hh:mm:ss

SET DATEFORMAT에 대한 순서 설정 날짜, smalldatetime으로, 날짜, DATETIME2 및 DATETIMEOFFSET 문자열을 해석 월, 일, 년의 날짜 부분을.

SET DATEFORMAT dmy; 필요한 작업을 수행해야합니다


답변 주셔서 감사합니다. 그러나 왜 쿼리가 Ubuntu 15.04에서는 작동하지만 Ubuntu 14.04에서는 작동하지 않는지 여전히 궁금합니다. 그들은 저장소에 다른 버전의 freetd를 가지고 있지만 예상 날짜 형식이 변경되었음을 알리는 변경 로그를 찾지 못했습니다. 그러나 나는 freetds mssql 지원을 거의 포기했습니다. 마이크로 소프트가 먼 미래에 PHP7 용 안정적인 드라이버를 출시하기를 바란다 : github.com/Microsoft/msphpsql/tree/PHP-7.0-Linux
NoMad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.