SQLSRV 驱动程序与带有 MS SQL Server 的 PHP 的 PDO 驱动程序

Posted

技术标签:

【中文标题】SQLSRV 驱动程序与带有 MS SQL Server 的 PHP 的 PDO 驱动程序【英文标题】:SQLSRV driver vs. PDO driver for PHP with MS SQL Server 【发布时间】:2012-07-21 19:22:21 【问题描述】:

在选择 SQLSRV 驱动程序和 PDO 驱动程序(对于带有 MS SQL 服务器的 php)时,我应该考虑哪些注意事项?

我看到了之前的 *** 帖子 (When using PHP on Windows, what is better (1) the native driver for SQL Server or (2) the PDO driver?),但答案似乎有点缺乏,并且没有提到使用 SQLSRV 驱动程序的所有好处,如this article 中提到的那样。

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

【问题讨论】:

【参考方案1】:

Microsoft 终于投入了一些资源来定制他们的原生驱动程序以与 PHP 一起工作。我目前正在对 Apache 2.4 64 位进行 beta 测试。

Beta PHP 7 SQL_SRV 64Bit Driver

【讨论】:

【参考方案2】:

SQLSRV 和 PDO_SQLSRV 是两个 current-generation php drivers available from Microsoft,但两者都使用相同的代码:SQL Server Native Client 11。(这就是为什么没有 Mac 或 Linux 版本的 php 驱动程序:它们只是包装器。)两个驱动程序应该相似;这只是您喜欢哪种 API 的问题。

在大多数情况下,出于跨平台的考虑,人们会使用 PDO_SQLSRV 驱动程序。然而,在查看了一个新(小型)项目的两个驱动程序之后,我选择了 SQLSRV 驱动程序,因为它将数据作为基础 SQL Server 数据类型的 [a map] 返回,而 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,因为我懒得处理日期类。)

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

【讨论】:

【参考方案3】:

PDO 允许您编写代码以合理地与 DB 无关。

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

现在,与 DB 无关似乎并不重要——如果您使用的是 SQL Server,那么您可能已经被告知这是必需的,仅此而已——但您无法预测在未来,所以如果在 DB 中性驱动程序和 DB 特定驱动程序之间进行选择,并且您没有任何其他偏好的理由,那么选择中性驱动程序....它会让生活变得很多如果您的公司被接管并且新老板想使用 Oracle 作为数据库,那么会更容易!

另外,由于它是 DB 中立的,因此 PDO 在 PHP 社区中更加标准和知名。与使用 MSSQL 驱动程序相比,您将从在线站点(例如这个站点)获得更多关于 PDO 的帮助。

【讨论】:

以上是关于SQLSRV 驱动程序与带有 MS SQL Server 的 PHP 的 PDO 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

带有命名参数的php sqlsrv_query存储过程

无法使用 sqlsrv 从 CodeIgniter 连接 SQL 数据库

Laravel 到 SQL Server (sqlsrv)。 [PDOException] 找不到驱动程序

PHP sql查询不返回表格内容

Codeigniter MSSQL/SQLSRV 连接

SQL Server Driver for PHP之sqlsrv相关函数