2012-11-29 14 views
5

Non mi sembra di essere in grado di ottenere una semplice clausola WHERE con un parametro di lavorare, sono costantemente ottenendo un messaggio di errore che dice:PHP DOP ODBC - I tipi di dati incompatibili in uguale all'operatore

[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) 

Ho provato questa query in molti modi diversi, ad es.

Senza nome:

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

Senza nome e l'utilizzo bindValue impostandolo stringa

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

nome e l'utilizzo di BindParam per impostarla su stringa:

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

Ma non importa quanto mi fallo, ricevo sempre questo messaggio di errore.

La colonna in questione è di tipo: varchar (max), quindi presumibilmente sta assumendo il parametro viene inviato è di tipo 'text' anche quando a specificare che sia un valore stringa (char, varchar)

Non riesco a cambiare il database come per un altro software.

Qual è il modo per aggirare questo? Davvero non voglio dover CAST ogni volta che faccio una clausola in cui questo (o è quello che fanno tutti?).

Grazie.

+0

Avendo lo stesso problema ... l'hai capito? – MizAkita

+0

Hai provato '" SELEZIONA TOP 1 * DA bksb_Resources DOVE TIPO ResourceType? "˙'? Se non usi i caratteri jolly, funzionerà quasi identicamente come '='. –

risposta

0

Hai provato a cambiare il tipo di campo in CHAR o VARCHAR? (e non VARCHAR (MAX) che hanno questo tipo di incompatibilità).

Oppure hai provato a convertire i tipi di dati?

$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(); 

mi dispiace ma non ho MS SQL Server per testare il codice, ma ottenere che punta da questa pagina: https://msdn.microsoft.com/en-us//library/ms176089.aspx

Nota che l'avvertimento:

Codice le traduzioni di pagina sono supportate per i tipi di dati char e varchar, ma non per il tipo di dati di testo. Come con le versioni precedenti di SQL Server, la perdita di dati di durante le traduzioni di code page non viene segnalata.

Spero che sia d'aiuto!

2

Abbiamo avuto un problema simile a questo, e nel nostro caso abbiamo avuto il seguente nel nostro file /etc/odbc.ini:

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

Abbiamo scoperto che se si cambia la TDS_Version-7.2 tutte le nostre domande bind ha iniziato a lavorare in modo corretto .

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

non sono sicuro del motivo per questo, ma ho il sospetto che probabilmente è documentato da qualche parte.