2012-06-13 28 views
6

Với bảng:So sánh chuỗi với trường số trở về kết quả bất ngờ

CREATE TABLE IF NOT EXISTS `users` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

Thêm một vài hàng:

INSERT INTO `users` (`id`,`name`) VALUES (NULL , 'Bob'),(NULL , 'Larry'),(NULL , 'Steve'); 

Tại sao, OH TẠI SAO! không trả lại kết quả truy vấn này:

SELECT * FROM `users` WHERE id = "2this-is-not a numeric value" 

Kết quả:

query returned 1 row(s) in 0.0003 sec 
id name 
----------------- 
2 Larry 

Các chuỗi được sử dụng trong mệnh đề where được rõ ràng được chuyển đổi sang một giá trị số - người đã nói để làm điều đó ?! Tôi không thể tìm thấy bất kỳ tài liệu nào cho thấy mysql hoặc PHP sẽ tự động gán chuỗi ký tự của tôi.

Điều này chỉ hoạt động nếu ký tự số là ký tự đầu tiên trong chuỗi, "this 2 is not numeric" sẽ không trả lại kết quả. "12 2" sẽ trở thành 12, "1 2" (một không gian hai) trở thành 1.

Mọi bài viết hoặc tài liệu giải thích về hành vi này sẽ được đánh giá cao.

+0

mysql doens't sử dụng 'thay vì "để biểu thị chuỗi nó chỉ có thể nhìn vào giá trị số cố gắng đúc nó vào numerber ngầm và sau đó cắt ngắn Vì vậy, ... Tại sao oh tại sao!: D là bạn sử dụng dấu ngoặc kép cho một lĩnh vực Numeric buộc nó để làm một chuyển đổi tiềm ẩn? không cần phải nói tôi tin rằng nó hành vi kỳ lạ là tốt .. – xQbert

+0

Hoặc là tôi luôn luôn sử dụng dấu nháy đơn cho mã, vì vậy tôi luôn luôn gửi báo giá gấp đôi để sql –

+0

Tôi tự hỏi những gì bạn sẽ nhận được kết quả nếu bạn cast chuỗi của bạn để bigint ngầm trong một lựa chọn.Nếu bạn nhận được 2 ... thì đó là chuyển đổi tiềm ẩn và o của tôi là Hành vi ODD. – xQbert

Trả lời

10

Đó là trong tài liệu MySQL đây: http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

+1

'SELECT CONVERT (" 2giây-không-là một giá trị số ", KHÔNG ĐƯỢC CHUYỂN)' trả về '2'. Có lẽ bạn có thể thêm điều này vào câu trả lời của bạn. – Mike

+0

KHÔNG THÍCH. Tôi muốn 0 kết quả - không có hàng nào có id là "2yourmom". Khi tôi nói 'WHERE id =" 2yourmom "', tôi có nghĩa là ở đâu vị trí id bằng với giá trị đó. Tự động truyền hút, bất cứ nơi nào xảy ra, bằng bất kỳ ngôn ngữ nào. Dù sao ... cảm ơn cho các liên kết: D –

+0

+1 này Nails lý do. Implicit chuyển đổi trong mysql S drop thả các giá trị phi số sau một int và sau đó thực hiện chuyển đổi ngầm. Đáng sợ như địa ngục với tôi nhưng nó nằm trong tài liệu – xQbert

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