2012-11-29 40 views
5

Tôi dường như không có khả năng để có được một đơn giản mệnh đề WHERE với một tham số để làm việc, tôi thường xuyên nhận được một thông báo lỗi nói:PHP PDO ODBC - Các kiểu dữ liệu không tương thích trong tương đương với toán tử

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

Tôi đã thử truy vấn này theo nhiều cách khác nhau, ví dụ:

Chưa đặt tên:

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

Không được đặt tên và sử dụng bindValue đặt nó vào chuỗi

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

Đặt tên và sử dụng bindParam để đặt nó vào chuỗi:

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

Nhưng không có vấn đề làm thế nào tôi làm điều đó, tôi luôn nhận được thông báo lỗi này.

Cột trong câu hỏi là loại: varchar (max), vì vậy có lẽ nó là giả định các tham số được gửi đi là loại 'text' ngay cả khi tôi xác định nó là một giá trị chuỗi (char, varchar)

Tôi không thể thay đổi cơ sở dữ liệu vì nó là một phần mềm khác.

Cách này là gì? Tôi thực sự không muốn phải CAST mỗi lần tôi làm một điều khoản như thế này (hoặc là những gì mọi người làm gì?).

Cảm ơn bạn.

+0

Có cùng một vấn đề ... bạn có tìm ra điều này không? – MizAkita

+0

Bạn đã thử '" SELECT TOP 1 * FROM bksb_Resources WHERE ResourceType LIKE? "˙'? Nếu bạn không sử dụng các ký tự đại diện, nó sẽ hoạt động gần giống như '='. –

Trả lời

0

Bạn đã cố thay đổi loại trường thành CHAR o VARCHAR chưa? (và không phải VARCHAR (MAX) có loại không tương thích này).

Hoặc bạn đã cố gắng chuyển đổi các loại dữ liệu chưa?

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

Tôi xin lỗi nhưng tôi không có MS SQL Server để kiểm tra mã, nhưng tôi nhận được rằng đầu từ trang này: https://msdn.microsoft.com/en-us//library/ms176089.aspx

Lưu ý rằng cảnh báo:

Mã bản dịch trang được hỗ trợ cho các loại dữ liệu char và varchar, nhưng không được hỗ trợ cho loại dữ liệu văn bản. Như với các phiên bản trước của SQL Server, mất dữ liệu trong khi dịch trang mã không được báo cáo.

Hy vọng điều đó sẽ hữu ích!

2

Chúng tôi đã có một vấn đề tương tự như sau, và trong trường hợp của chúng tôi, chúng tôi có những điều sau đây trong tập tin /etc/odbc.ini của chúng tôi:

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

Chúng tôi phát hiện ra rằng nếu bạn thay đổi TDS_Version-7.2 tất cả các thắc mắc ràng buộc của chúng tôi bắt đầu làm việc một cách chính xác .

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

Tôi không chắc chắn về lý do này, nhưng tôi nghi ngờ có thể tài liệu ở đâu đó.

Các vấn đề liên quan