我遇到了一些不太有意义的事情。我注意到当您尝试将数据从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),我只是想知道为什么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)是否作为流返回。
答案 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_*()
函数的运气。