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

2022-08-30 21:59:17

在 SQLSRV 驱动程序与 PDO 驱动程序(对于带有 MS SQL Server 的 PHP)之间进行选择时,我应该考虑哪些注意事项?

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

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


答案 1

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

在大多数情况下,由于跨平台的考虑,人们会使用PDO_SQLSRV驱动程序。但是,在查看了新(小型)项目的两个驱动程序之后,我使用了 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

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


答案 2

PDO 允许您编写代码以使其与数据库保持合理关系。

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

数据库中立现在似乎并不重要 - 如果你使用的是SQL Server,那么你可能已经被告知这是必需的,而不是别的 - 但你不能预测未来事情会如何变化,所以如果选择数据库中立驱动程序和数据库特定的驱动程序,并且你没有任何其他理由偏好, 然后去中立的那个....如果您的公司被接管,并且新老板希望使用Oracle作为数据库,这将使生活变得更加轻松!

此外,因为它是数据库中立的,所以PDO在PHP社区中更标准,更知名。与使用 MSSQL 驱动程序相比,您将从在线站点(如此站点)获得更多有关 PDO 的帮助。


推荐