2012-06-13 13 views
6

Verilen tablo:dönen sayısal alanına karşı dize karşılaştırma beklenmedik sonuçlar

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 ; 

satır bir çift ekleyin:

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

Neden, NEDEN OH! yapar bu sorgu dönüş sonuçları:

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

Sonuç:

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

fıkra açıkça sayısal değere dönüştürülür ediliyor kullanılan dize - bunu söyledi ?! Mysql veya PHP'nin dize değişmezini otomatik olarak yayınlayacağını varsayan hiçbir belge bulamıyorum.

Bu, yalnızca sayısal karakter dizedeki ilk karakterse işe yarar, "this 2 is not numeric" sonuç döndürmez. "12 2", 12, "1 2" (one-space-two), 1 olur.

Bu davranışı açıklayan tüm makaleler veya belgeler takdir edilecektir.

+0

doens't MySQL kullanımı 'yerine sadece kesmek sonra örtülü olarak numerber için döküm denemek ve sayısal değer bakıyor olabilir nümerik olmayan değerler ... Öyleyse neden niçin: D: Sayısal bir alan için, örtülü bir dönüşüm yapmak zorunda kalmaya zorlayan alıntılar mı kullanıyorsunuz? Ben de garip davranışlara inanıyorum demeye gerek yok .. – xQbert

+0

Her zaman. kod için, bu yüzden her zaman sql –

+0

için çift tırnaklar göndermek Ben bir seçim içinde örtülü olarak bigint için dize döküm eğer sonuç alacağını merak ediyorum.Eğer 2 alırsanız ... o zaman örtülü dönüşüm ve benim ODD davranışı – xQbert

cevap

10

O MySQL burada belgelerinde açıklanmıştır:? Dizesini belirtmek için " http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

+1

'SELECT CONVERT (" 2this değil bir sayısal değer ", UNSIGNED)' 2 'döndürür. Belki bunu cevabınıza ekleyebilirsin. – Mike

+0

GİBİ YAPMAYIN. Ben 0 sonuç istiyorum - hiçbir satır "2yourmom" kimliğine sahip değil. WHERE id = "2yourmom" dediğimde, kelimenin tam anlamıyla bu değere eşit olduğu anlamına gelir. Otomatik döküm, nerede olursa olsun, herhangi bir dilde berbat. Neyse ... bağlantı için teşekkürler: D –

+0

+1 bu Çiviler sebebi. Örtülü mysql dönüştürür WILL bir int sonra sayısal olmayan değerleri bırakın ve sonra örtülü dönüştürme yapın. Benim için cehennem gibi korkutmak ama dokümanlar içinde – xQbert

İlgili konular