względu na stół:Porównywanie ciąg przeciwko pola liczbowego powrocie nieoczekiwane wyniki
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 ;
dodać kilka wierszy:
INSERT INTO `users` (`id`,`name`) VALUES (NULL , 'Bob'),(NULL , 'Larry'),(NULL , 'Steve');
Dlaczego, och dlaczego! Czy to powrót wyników zapytania:
SELECT * FROM `users` WHERE id = "2this-is-not a numeric value"
Wynik:
query returned 1 row(s) in 0.0003 sec
id name
-----------------
2 Larry
napis używany w przypadku gdy klauzula jest wyraźnie są konwertowane do wartości liczbowej - który powiedział to zrobić ?! Nie mogę znaleźć żadnej dokumentacji, która sugerowałaby, że mysql lub PHP zakładały automatyczne rzutowanie mojego ciągu literowego.
Działa to tylko wtedy, gdy znak numeryczny jest pierwszym w łańcuchu, "this 2 is not numeric"
nie zwróci wyników. "12 2"
stanie się 12
, "1 2"
(jedno-przestrzeni-dwa) staje się 1
.
Wszelkie artykuły lub dokumentacja wyjaśniająca to zachowanie będą mile widziane.
użytku doens't mysql 'zamiast "oznaczający ciąg może być po prostu patrząc na wartość numeryczną spróbować oddać go do numerber niejawnie, a następnie obciąć A więc ... Dlaczego, och dlaczego!: D używasz cytatów dla pola Numerycznego, zmuszając go do niejawnej konwersji? nie muszę dodawać, że uważam to za dziwne zachowanie – xQbert
Albo. Zawsze używam pojedynczych cudzysłowów dla kodu, więc zawsze wysyłam podwójne cytaty do sql –
Zastanawiam się, jaki wynik uzyskałbyś, jeśli rzucisz swój ciąg do biginta niejawnie w selekcji. Jeśli uzyskasz 2 ... to jest to niejawna konwersja i moja jest moja Zachowanie ODD – xQbert