2012-11-29 16 views
5

不相容我似乎並沒有能夠得到一個簡單的WHERE以參數子句來工作,我不斷收到錯誤消息說:PHP PDO ODBC - 數據類型是等於運算符

[Microsoft][ODBC SQL Server Driver][SQL Server]The data types varchar(max) and text are incompatible in the equal to operator. (SQLExecute[402] at ext\pdo_odbc\odbc_stmt.c:254) 

我已經用多種不同的方式嘗試過這個查詢,例如

無名:

$query = $DBH->prepare("SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType = ?"); 
$query->execute(array('assessment')); 

未命名,並使用bindValue其設置爲字符串

$query = $DBH->prepare("SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType = ?"); 
$query->bindValue(1, 'assessment', PDO::PARAM_STR); 
$query->execute(); 

命名,並使用bindParam將其設置爲字符串:

$val = 'assessment'; 
$query = $DBH->prepare("SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType = :myp"); 
$query->bindParam(':myp', $val, PDO::PARAM_STR); 
$query->execute(); 

但無論怎樣我做到這一點,我總是得到這個錯誤信息。

在考慮中的列的類型的:VARCHAR(最大),所以推測它是假設的參數被髮送的類型是「文本」,甚至當我指定它是一個字符串值(CHAR,VARCHAR)

我無法更改數據庫,因爲它是用於另一個軟件的。

這是怎麼回事?我真的不想每次都去CAST做一個像這樣的where子句(或者每個人都做什麼?)。

謝謝。

+0

有同樣的問題......你知道了嗎? – MizAkita

+0

你試過'「SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType LIKE?」˙'?如果你不使用通配符,它​​的功能幾乎與'='一樣。 –

回答

0

您是否嘗試將字段類型更改爲CHAR o VARCHAR? (而不是VARCHAR(MAX)有這種不兼容性)。

或者您是否嘗試過轉換數據類型?

$val = 'assessment'; 
$query = $DBH->prepare(
    "SELECT TOP 1 * FROM bksb_Resources WHERE 
    CONVERT(VARCHAR, ResourceType) = :myp"); 
$query->bindParam(':myp', $val, PDO::PARAM_STR); 
$query->execute(); 

我很抱歉,但我沒有MS SQL Server的測試代碼,但我得到這個頁面提示:https://msdn.microsoft.com/en-us//library/ms176089.aspx

注意警告:

代碼char和varchar數據類型支持頁面轉換, 但不支持文本數據類型。與早期版本的SQL Server一樣, 代碼頁翻譯期間的數據丟失未被報告。

希望它有幫助!

2

我們有類似這樣的問題,在我們的例子中,我們已經在我們/etc/odbc.ini文件中的以下內容:

[ServerAlias] 
Driver = FreeTDS 
Server = 1.2.3.4 
PORT = 1433 
TDS_Version = 8.0 

我們發現,如果你改變了TDS_Version7.2我們所有的綁定查詢開始正常工作。

[ServerAlias] 
Driver = FreeTDS 
Server = 1.2.3.4 
PORT = 1433 
TDS_Version = 7.2 

我不確定原因,但我懷疑它可能記錄在某處。

相關問題