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

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

我看到了之前的 Stackoverflow 帖子 (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 的情况吗?)程序员可以将其作为资源引用的答案。

【问题讨论】:

    标签: php sql-server pdo driver


    【解决方案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 的帮助。

        【讨论】:

          猜你喜欢
          • 2018-03-02
          • 2017-09-15
          • 1970-01-01
          • 2022-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-28
          相关资源
          最近更新 更多