SQLSRV驱动程序与PDO驱动程序,适用于带有MS SQL Server的PHP


SQLSRV driver vs. PDO driver for PHP with MS SQL Server

在选择SQLSRV驱动程序和PDO驱动程序(对于带有MS SQL server的PHP)时,应该考虑哪些因素?

我看到了上一篇Stackoverflow文章(在Windows上使用PHP时,(1)SQL Server的本地驱动程序或(2)PDO驱动程序哪个更好?)但答案似乎有点缺乏,并且没有提到本文中提到的使用SQLSRV驱动程序的所有好处。

我正在寻找一个全面和最新的答案(例如,SQLSRV驱动程序仍然只适用于Windows吗?),程序员可以将其作为一种资源。

SQLSRV和PDO_SQLSRV是Microsoft提供的两个当前一代php驱动程序,但它们都使用相同的代码:SQL Server Native Client 11。(这就是为什么没有Mac或Linux版本的php驱动程序:它们只是包装器。)这两个驱动程序的性能应该相似;这只是你更喜欢哪种API的问题。

在大多数情况下,出于跨平台考虑,会使用PDO_SQLRV驱动程序。然而,在研究了一个新(小型)项目的两个驱动程序后,我选择了SQLSRV驱动程序,因为它以底层SQL Server数据类型的映射形式返回数据,而PDO_SQLSRV则以字符串形式返回所有数据。

因此,如果您的sql是:

SELECT 1234 as integer, Cast(123.456 as float) as float, 
       getdate() as date, '1234' as string1,'123.456' as string2;

然后PDO_SQLSRV中的行的var_dump给出:

  array(1) {
    [0] =>
    array(5) {
      'integer' =>
      string(4) "1234"
      'float' =>
      string(7) "123.456"
      'date' =>
      string(23) "2012-12-06 22:35:05.373"
      'string1' =>
      string(4) "1234"
      'string2' =>
      string(7) "123.456"
    }
  }

而SQLSRV驱动程序给出:

array(1) {
    [0] =>
    array(5) {
      'integer' =>
      int(1234)
      'float' =>
      double(123.456)
      'date' =>
      class DateTime#1 (3) {
        ...
      }
      'string1' =>
      string(4) "1234"
      'string2' =>
      string(7) "123.456"
    }
  }

PDO_SQLSRV把我所有的数据都转换成一个字符串,不管我愿不愿意,这让我抓狂,所以我使用了SQLSRV。(我不得不承认,我设置ReturnDatesAsStrings=true是因为我太懒了,无法处理日期类。)

我也更喜欢语法,但那只是我自己。

PDO允许您编写与数据库相对应的代码。

如果你想要真正的DB中立,你会想要使用像NotORM这样的完整的DB抽象层——对于普通的PDO,你仍然需要注意SQL语法的差异,但至少你的基本PHP代码是DB中立的。

现在,与数据库无关似乎并不重要——如果你使用的是SQL Server,那么你可能被告知这是必需的,而不是其他什么——但你无法预测未来会发生什么变化,所以如果在与数据库无关的驱动程序和特定于数据库的驱动程序之间进行选择,并且你没有任何其他偏好理由,那么就选择中立的驱动程序。。。。如果你的公司被接管,新老板想用甲骨文作为数据库,这会让你的生活轻松很多!

此外,由于PDO是与DB无关的,所以它在PHP社区中更标准、更知名。与MSSQL驱动程序相比,您将从在线站点(如本站点)获得更多有关PDO的帮助。

Microsoft终于投入了一些资源来定制他们的本地驱动程序,使其能够很好地与PHP配合使用。我目前正在测试Apache 2.4 64位。

Beta PHP 7 SQL_SRV 64位驱动程序