为什么ANSI_NULLS和ANSI_WARNINGS需要在PHP中设置为链接服务器查询


Why does ANSI_NULLS and ANSI_WARNINGS need to be set to on for linked server queries in PHP?

我有一个使用OpenQuery的链接服务器语句:

SELECT mycol1, mycol2, mycol3 
FROM OPENQUERY(MYLINKEDSERVER, 'SELECT * FROM mysqldb.table')

以上在SSMS中毫无疑问地工作。当我使用PHP MySQL包装器在web应用程序上运行此查询(使用相同的SQL Server凭据)时,我必须插入以下2条语句:

SET ansi_null ON

设置ANSI_WARNINGS在

我已经通读了ANSI_NULLS和ANSI_WARNINGS的定义,但不太明白为什么必须将它们设置为on才能在PHP中运行查询。

有人知道原因吗?

做了一些调查。简而言之,这意味着如果你对一个非SQL Server框的链接服务器运行查询,那么你很可能需要打开这两个特性来标准化跨不同数据库处理某些比较操作符的方式。

假设,SQL Server的未来版本将默认将set_null设置为ON,并且没有更改它的选项

PHP中:

  1. 首先发出SET命令" SET ANSI_NULLS ON;设置ansi_warnings为;"
  2. 然后执行SELECT * FROM customers ....;

如果您将它们全部组合在一个脚本中:

   SET ANSI_NULLS ON; 
   SET  ANSI_WARNINGS ON;
   SELECT * FROM customers ...

发出错误。

这几乎是这个问题的翻版。注意,在这种情况下返回的错误消息是:

异构查询需要ANSI_NULLS和ANSI_WARNINGS选项要为连接设置。这确保了查询语义的一致性。启用这些选项,然后重新发出查询

文档中确实说了:

对于执行分布式查询,

SET ANSI_NULLS应该设置为ON

对于SET ANSI_WARNINGS有相同的注释。我怀疑正如Álvaro所建议的那样,您的PHP代码隐藏了一个错误,而且很有可能就是上面提到的那个错误。这个问题在DBA站点上有更详细的介绍。