2012-07-12 30 views
5

Tôi có một kết quả thú vị và không hiểu tại sao.Truy vấn MySQL - khoản `where (varchar)` trả về các mục bắt đầu bằng một số. Tại sao?

SELECT * 
    FROM items im 
WHERE ItemNumber 

ItemNumbervarchar(50).

Kết quả của truy vấn này trả về tất cả các mục mà số ItemNumber bắt đầu bằng một số. Nếu số ItemNumber bắt đầu bằng một chữ cái, nó sẽ bị loại trừ.

Có ai có giải thích tại sao truy vấn tương tác theo cách này không?

+0

Tôi giả sử bạn nhận thức được rằng mệnh đề where là không rõ ràng - có vẻ như không cần thiết hoặc không đầy đủ. (Lý do nó hoạt động theo cách nó được thảo luận dưới đây) –

Trả lời

1

MYSQL sẽ trả về tất cả các hàng có ItemNumber bắt đầu bằng một số là greater than equal to 0.5 and less than equal to -0.5. Nó xem xét tất cả số greater >= +/-0.5 as true. Và mệnh đề where hoạt động dựa trên chỉ đúng hoặc sai.

true >= -0.5 > false < 0.5 <= true 

Rất thông minh, mysql xem xét Tất cả số >= +/-0.5 như 1 (true). Phải mất đúng cho giá trị khác không được làm tròn.

NẾU bạn viết

SELECT * FROM items im WHERE 1; // will return all rows. 
SELECT * FROM items im WHERE 0.5; // will return all rows. 
SELECT * FROM items im WHERE 0.4; // will return nothing. 
SELECT * FROM items im WHERE 1 and 0.2; // will return nothing. 
SELECT * FROM items im WHERE 0.3 or 0.5; // will return all rows. 
0

Mệnh đề WHERE của bạn đang chờ BOOLEAN, bây giờ tôi không biết mysql quản lý varchar số như thế nào, nhưng tôi nghĩ mysql có thể giả định chuỗi bắt đầu bằng số tương đương với đúng. Có thể giải thích truy vấn là

SELECT * 
    FROM items im 
    WHERE ItemNumber IS TRUE 
-1

Có thể bạn nên so sánh ItemNumber với thứ gì đó. Hoặc thử

WHERE ItemNumber NOT NULL 

hoặc một cái gì đó giống như

WHERE ItemNumber != '' 
6

Đây là chiến lược của MySQL là thông minh và giả định rằng nó biết những gì bạn có ý nghĩa (như trái ngược để làm những gì bạn viết).

Bất kỳ biểu thức nào đánh giá khác không được coi là đúng. Những mục bắt đầu bằng một chữ cái không thể (ẩn) được chuyển đổi thành một số do đó nó được coi là số không và có nghĩa là "sai". Tôi sẽ nghĩ rằng các mục có giá trị (ký tự) '0' cũng bị loại trừ.

Tuyên bố sau đây ví dụ hạnh phúc sẽ xóa tất cả các hàng trong bảng của bạn:

DELETE FROM foobar 
WHERE 42; 

Bạn không thể biến hành vi này đi. Thậm chí không ở chế độ ANSI, MySQL sẽ đưa ra một biểu thức cú pháp.

+0

Đây cũng là số không 'SELECT * FROM' test' t trong đó 0,4; 'nhưng không được coi là đúng. – manurajhada

0

MySQL hỗ trợ điều boolean này nên bị loại bỏ. Nó dẫn đến sự nhầm lẫn và sẽ trả về kết quả sai/không được giải quyết. Không có RDBMS nào khác hỗ trợ điều này.Giả sử bạn có một thủ tục với một tham số và bạn quên xác định nó như dưới đây

WHERE col 

Nó sẽ trả lại toàn bộ dữ liệu và nó là rất khó khăn để gỡ lỗi

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