SQL Nvarchar(max)无法正常工作

时间:2013-11-14 15:36:35

标签: php sql sql-server pdo odbc

我遇到了一些不太有意义的事情。我注意到当您尝试将数据从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驱动程序,我在某处看到您无法正确使用nvarchar(max),但是我确实将其编码为使用它。这是在Windows Server 2003上使用SQL Server 2005,PHP 5.3执行的。

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

我不需要知道如何解决它,无论如何我都在使用NVARCHAR(4000),我只是想知道为什么NA​​RCHAR(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)是否作为流返回。

1 个答案:

答案 0 :(得分:2)

我怀疑两个问题可能是错误的 - 拿着一把盐,因为我没有触及永久性的Windows盒子。

我认为,一个问题可能是您使用PDO_ODBC驱动程序。它意味着与DB2等兼容,所以我看到它在大型varchar上返回流的可能性很小。以db引擎不可知和一致的名义,基本上。使用PDO_SQLSRV驱动程序可能会更幸运一点,但这让我感到...

另一个问题可能是您使用fetchAll(PDO::FETCH_ASSOC)。据我所知,这将使您获取您的领域的全部价值。我怀疑PDO在数据库引擎和下一代数据库的行为方面会有很大不同 - 数据库引擎不可知和一致,yada yada。

果然,PDO_Postgres(我比较熟悉)的行为与大型对象的nvarchar(max)字段相似,除非您使用Postgres-specific constants或转换使用相关的{{3}函数。

看到PDO_SQLSRV没有类似的常量,我建议你需要试试mssql_*()函数的运气。