2016-05-29 30 views
8

Tôi có một bảng gọi là tabela1512823699024883 trông như thế này: enter image description hereMySQL hiển thị kết quả lạ

On mà tôi chạy truy vấn như thế này:

SELECT * FROM tabela1512823699024883 WHERE `age` = 'male' 

Truy vấn này không có ý nghĩa, bởi vì age cột là int và tôi đang tìm kiếm giá trị string trong truy vấn của mình, nhưng MySQL vẫn không trả lại bất kỳ hàng trống nào. Dưới đây là những gì truy vấn được trả về: enter image description here Vì vậy, age hàng không chứa male giá trị không được trả về hàng. Làm thế nào điều này có thể có thể?

+3

Tôi đoán, mysql đã cố chuyển đổi chuỗi'male' thành int .. sẽ là 0 và trả về kết quả là 'age = 0' –

+1

Tôi hy vọng đó không phải là dữ liệu người dùng thực trong các ảnh chụp màn hình này? – Bergi

Trả lời

14

Sự cố tương tự sẽ xảy ra khi truyền chuỗi thành một loại số nguyên.

SELECT CAST('male' as SIGNED); #0 
#or 
SELECT CAST('male' as UNSIGNED); #0 

Tuy nhiên nếu một số được cung cấp trong chuỗi.

SELECT CAST('1234male' as UNSIGNED); #1234 
#and 
SELECT CAST('male1234' as UNSIGNED); #0 

Để giải quyết vấn đề việc sử dụng BINARY trên cột, mà cũng sẽ gây ra những giá trị văn bản để trở thành trường hợp nhạy cảm.

SELECT * FROM tabela1512823699024883 WHERE BINARY `age` = 'male'; 
+0

Giải thích rất tốt và các ví dụ điển hình. – pbalazek

+0

Được chấp nhận vì không chỉ đưa ra lời giải thích tốt mà còn giải quyết được vấn đề trả về các giá trị chính xác từ bảng. Người đàn ông tuyệt vời! – Ognj3n

11

Hãy thử truy vấn đơn giản này:

SELECT 'male' + 0 

này dường như không có ý nghĩa. Tuy nhiên, truy vấn thực hiện và trả về giá trị là 0. Điều này là do chuyển đổi loại tiềm ẩn. Giá trị chuỗi 'male' được chuyển đổi thành 0 và sau đó được thêm vào 0 và do đó 0 được trả lại.

Điều tương tự cũng xảy ra với truy vấn của bạn. 'male' được chuyển đổi thành 0 khi được so sánh với trường loại int.

3

"nam" là 0! Vì vậy, bạn cứ bị hồ sơ, nơi tuổi là 0. Để thực sự hiểu những gì đang xảy ra, chỉ cần làm:

select user_name, age, age='male' from tabela1512823699024883; 

cột thứ 3 của bạn sẽ được 1 đối với các hồ sơ có chứa '0' tuổi, và '0' cho các hồ sơ có chứa phi tuổi -zero.

2

Vấn đề ở đây là bất cứ khi nào bạn cố gắng để so sánh một chuỗi để nguyên cột, giá trị sẽ được biến đổi thành kiểu dữ liệu của cột. Tương tự trường hợp sẽ xảy ra với float, int lớn, nhỏ int, vv

gì bao giờ giá trị được thông qua trong so sánh đầu tiên được đúc cho rằng kiểu dữ liệu cụ thể bằng động cơ mysql

Đây là thử nghiệm kết quả của truy vấn truyền vài giá trị.

select cast('' AS UNSIGNED), cast('anything' AS UNSIGNED), cast(NULL AS UNSIGNED), cast(35.56 AS UNSIGNED), cast(NOW() AS UNSIGNED), cast(1 AS UNSIGNED), cast('Test' AS BINARY), cast('' AS BINARY); 

Result of casting few data types

SELECT * FROM `test_type` WHERE flt = 'test' 

Here flt is float type column.

các FLT là kiểu float cột.

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