18

在 SQLSRV 驱动程序与 PDO 驱动程序(对于带有 MS SQL 服务器的 PHP)之间进行选择时,我应该考虑哪些因素?

我看到了这篇以前的 Stackoverflow 帖子(在 Windows 上使用 PHP 时,什么是更好的(1)SQL Server 的本机驱动程序或(2)PDO 驱动程序?),但答案似乎有点缺乏,并没有提到所有的好处使用本文中提到的 SQLSRV 驱动程序。

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

4

3 回答 3

19

SQLSRV 和 PDO_SQLSRV 是Microsoft 提供的两个当前一代 php 驱动程序,但两者都使用相同的代码: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是因为我懒得处理日期类。)

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

于 2012-12-07T03:59:47.147 回答
13

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

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

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

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

于 2012-07-23T16:19:15.503 回答
4

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

测试版 PHP 7 SQL_SRV 64 位驱动程序

于 2016-03-30T03:36:18.337 回答