1

我遇到了一些不太有意义的事情。当您尝试将数据从 SQL Server 数据库返回到 PHP 时,我注意到发生了一件奇怪的事情。如果你在 PHP 中使用 SQL Sever Native Client 驱动,根据网上的文章,NVARCHAR(MAX) 应该是作为流类型返回的。在 SQL Server Management Studio 中,如果我使用这些数据类型创建一个新表,则 nvarchar(max) 字段将作为流返回:

[PK][int]
[nvarchar(255)]
[nvarchar(max)]

如果我使用这些数据类型创建表,则 nvarchar(max) 将作为其实际值返回,而不是流。

[PK][int]
[nvarchar(256)]
[nvarchar(max)]

我在某处看到如果您不说要使用 SQL Native Client 驱动程序,您无法在 PHP 中正确使用 nvarchar(max),但是我确实将其编码以使用它。这是在 Windows Server 2003 上使用 SQL Server 2005、PHP 5.3 执行的。

谁能解释为什么我可以在一张表中而不是另一张表中获得 nvarchar(max) 的实际值?

我不需要知道如何解决它,无论如何我都在为我的表使用 NVARCHAR(4000),我只想知道为什么 NARCHAR(256) 允许 NVARCHAR(MAX) 工作,即使它不应该工作根据我在网上看到的。

编辑:

这是我使用并更改以访问使用存储参数的基本 PHP 代码:

<?php
$user = "usercm";
$pass ="cmuserpassword";

try{$conn = new PDO("odbc:DRIVER={SQL Server Native Client 10.0};SERVER=EXAMPLE;DATABASE=EXAMPLE;",$user,$pass);}
catch(PDOException $e){echo "Connection Failed";}

if($conn)
{
    $uspGetAll = $conn->prepare("{CALL uspGetPowerDetails()}");
    if($uspGetAll->execute())
      {
          $results = $uspGetAll->fetchAll(PDO::FETCH_ASSOC);
          $_SESSION['testExample'] = $results;
}
$conn = null;
?>

我不想知道其他驱动程序,我只想知道为什么声明为 256 或以上的不同字段会改变 nvarchar(MAX) 是否作为流返回。

4

1 回答 1

3

我怀疑两个问题可能有问题 - 用一把盐来处理这个问题,因为我已经很久没有碰过 Windows 盒子了。

我认为,一个问题可能是您对 PDO_ODBC 驱动程序的使用。它旨在与 DB2 等兼容,因此我认为它在大型 varchar 上返回流的可能性很小。基本上,以与数据库引擎无关和一致的名义。改用 PDO_SQLSRV 驱动程序可能会更幸运一些,但这让我...</p>

另一个问题可能是您使用fetchAll(PDO::FETCH_ASSOC). 据我所知,这将使您获得该领域的全部价值。我怀疑 PDO 从数据库引擎到下一个引擎的行为会非常不同——数据库引擎不可知且一致,yada yada。

果然,PDO_Postgres(我更熟悉)的行为就像您nvarchar(max)的大型对象字段一样,除非您使用Postgres 特定的常量或转向使用相关pg_*()函数。

看到 PDO_SQLSRV 没有类似的常量,我将建议您需要在这些mssql_*()函数上试试运气。

于 2013-11-22T18:54:18.930 回答