![如何设置 SQL Server PHP 驱动程序的日期时间格式](https://linux22.com/image/1506267/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%20SQL%20Server%20PHP%20%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E6%A0%BC%E5%BC%8F.png)
在我的 PHP 脚本中,我想将日期添加到 MS SQL Server 中的列(类型为 datetime)。我按照此博客文章设置了连接(Ubuntu 14.04/15.10 上的 php5-sybase、php5-odbc、freetds): https://blog.thesysadmins.co.uk/ubuntu-server-connect-to-mssql-via-php.html
我的问题是,在 php 脚本中使用与 SQL Management Studio 中完全相同的查询,通过 PHP 进行的查询失败,因为日期列被解释为 NULL。(缩写) 查询:
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′)
明显地,查询中的日期时间被解释为麦迪逊,但我找不到任何选项来改变它。令人惊讶的是,它在 Ubuntu 15.10 下可以运行,但在 14.04 下却不行,对 apache、php 使用相同的配置。freetds 和 php5-odbc 使用它们的默认值。
SQL Server 设置 (@@LANGUAGE = Germand、sp_helplanguage German dateformat = dmy) 和php.ini(iconv 日期时间格式)有麦迪逊配置。mssql.datetimeconvert = 开启与关闭没有区别。
tl;dr 我如何告诉 PHP 日期时间格式不是 MDY 而是 DMY?
答案1
正如评论中指出的那样转变()是一种解决方法。我不是 MS SQL 专家。我主要使用 MySQL。然而查找了一下,MS SQL 日期时间使用格式yyyy-mm-dd hh:mm:ss
有SET DATEFORMAT
设定顺序用于解释 date、smalldatetime、datetime、datetime2 和 datetimeoffset 字符串的月、日和年日期部分。
SET DATEFORMAT dmy;
应该完成你需要的任务
答案2
/etc/freetds/locales.conf
根本原因既不是 PHP,也不是 freetds,也不是任何 *NIX 系统设置。设置日期时间格式的详尽文档可以正常工作。
但是为了让 FREETDS 驱动程序解释指定格式的日期,您不能在查询中将其编码为字符串
正如你在我的问题中看到的,类型字段的值约会时间用单引号/勾号括起来。这样,FreeTDS 会将数据解释为字符串(准确地说是 varchar),并将其传递给 SQL Server。这就是查询失败的原因,因为 SQL-Server 不允许将 varchar 插入到 datetime 列中。
为什么完全相同的查询在 Ubuntu 的一个版本上有效,而在另一个版本上却无效,这让我无法理解。
tl;dr 不要在查询中使用引号括住日期时间值。我只花了 3 个月就意识到了这一点 :)