我看到了之前的Stackoverflow帖子(链接在此:When using PHP on Windows, what is better (1) the native driver for SQL Server or (2) the PDO driver?)但是答案似乎有点欠缺,并且未提及使用SQLSRV驱动程序时在这篇文章中提到的所有好处。
我正在寻找全面而及时的答案(例如,SQLSRV驱动程序只适用于Windows吗?),作为程序员可以参考的资源。
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 的语法,但这只是我的个人喜好。
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可以获得更多帮助。