PHP与MS SQL Server:SQLSRV驱动程序 vs. PDO驱动程序

19
在选择SQLSRV驱动程序与PDO驱动程序(用于PHP与MS SQL服务器)之间,应考虑哪些因素?
我看到了之前的Stackoverflow帖子(链接在此:When using PHP on Windows, what is better (1) the native driver for SQL Server or (2) the PDO driver?)但是答案似乎有点欠缺,并且未提及使用SQLSRV驱动程序时在这篇文章中提到的所有好处。
我正在寻找全面而及时的答案(例如,SQLSRV驱动程序只适用于Windows吗?),作为程序员可以参考的资源。
3个回答

19

SQLSRV和PDO_SQLSRV是微软提供的两个最新一代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 ,因为我懒得处理日期类。)

我也比较喜欢 SQLSRV 的语法,但这只是我的个人喜好。


13

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

如果您想要完全DB-neutral,您需要使用完整的DB抽象层,如NotORM -- 对于普通PDO而言,您仍然需要小心SQL语法差异,但至少您的基本PHP代码将是DB-neutral的。

现在DB-neutral可能看起来并不重要--如果您正在使用SQL Server,那么您可能已经被告知只能使用它--但是您无法预测未来会发生什么变化,所以如果选择是DB-neutral driver和DB-specific driver之间,并且您没有其他偏好,那么请选用neutral的...如果您的公司被接管且新老板想要使用Oracle作为数据库,这样会使生活变得轻松得多!

此外,由于它是DB neutral的,PDO在PHP社区中更加标准和知名。与MSSQL驱动程序相比,在线网站(例如此网站)上使用PDO可以获得更多帮助。


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接