2013-11-14 115 views
1

我遇到了一些不太合理的東西。我注意到當您嘗試將數據從SQL Server數據庫返回給PHP時發生了一個奇怪的事件。如果您在PHP中使用SQL Sever Native Client驅動程序,則應根據在線文章將NVARCHAR(MAX)作爲流類型返回。在SQL Server Management Studio中,如果我創建這些數據類型的數據類型爲nvarchar(最大)字段中返回一個流的新表:如果我創建使用這些數據類型,然後爲nvarchar(最大)表SQL Nvarchar(max)不能按預期工作

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

返回其實際價值而不是流。

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

我看到的地方,你不能正確使用爲nvarchar(最大)與PHP,如果你不說使用SQL Native Client驅動程序,然而,我有它編碼中使用它。這是在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)是否作爲流返回。

+0

你還沒有提到你的DBMS是什麼。我假設SQL Server並重新標記相應的 - 如果我錯了,隨時糾正它。 –

+0

是的,它是SQL Server,只是添加了。我原本提到它,但是當我刪除了一部分我不需要的問題時意外刪除了它。 –

+0

需要更多信息。什麼顯示?什麼是期望的輸出? – Zane

回答

2

我懷疑有兩個問題可能是錯誤的 - 用一小撮鹽來處理這個問題,因爲我沒有碰過Windows中的盒子。

我認爲可能是您使用PDO_ODBC驅動程序的一個問題。它意味着與DB2等兼容,所以我看不到它在大型varchar上返回流的可能性。基本上是以db引擎不可知和一致的名義。您可能會更幸運通過使用PDO_SQLSRV驅動程序,但這會帶來我...

另一個問題可能是您使用fetchAll(PDO::FETCH_ASSOC)。據我所知,這將使你獲得你領域的全部價值。我懷疑PDO在數據庫引擎和下一個數據庫引擎不可知並且一致的情況下表現得完全不同,yada yada。

果然,PDO_Postgres(其中我更熟悉)會像你nvarchar(max)場大對象,除非你使用Postgres-specific constants或轉向使用相關pg_*()功能。

看到PDO_SQLSRV沒有類似的常量,我會通過建議您需要嘗試mssql_*()函數的運氣來得出結論。

+0

是的,這絕對是PDO_ODBC的驅動程序。由於SQLSRV與Windows Server 2003不兼容,我最終發現使用ODBC驅動程序時發生此異常。奇怪的是,不同的字段會影響其結果。在2年前的3月份有一個關於PDO_ODBC和ODBC的問題:https://bugs.php.net/bug.php?id = 54169。有人發佈了一個適用於PDO_ODBC的快速修復程序,但似乎他們不知道影響結果的不同字段。其他網站總是說你無法訪問nvarchar(max)。 –