2012-06-13 56 views
6

鉴于表:字符串中的数字字段返回比较意外的结果

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 ; 

添加几行:

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

为什么,为什么!做这个查询返回的结果:

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

结果:

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

中使用的字符串where子句显然被转换为数值 - 谁说要做到这一点?我无法找到任何建议mysql或PHP会假定自动投射字符串文字的文档。

只有数字字符是字符串中的第一个字符时才起作用,"this 2 is not numeric"不会返回结果。 "12 2"将成为12,"1 2"(one-space-two)变成1

任何文章或文件解释此行为将不胜感激。

+0

好好尝试一下MySQL的使用“,而不是”来表示字符串时,它可能只是在看数值尝试投它隐含numerber,然后截断非数字值,所以......为什么哦为什么!:D你是否在数字字段中使用引号强制它进行隐式转换?不用说我相信它也是奇怪的行为 – xQbert

+0

要么我总是使用单引号对于代码,所以我总是发送双引号到sql –

+0

我想知道你会得到什么结果,如果你把你的字符串隐式地转换为bigint,如果你得到2 ...那么这是隐式转换,我的是我的ODD行为 – xQbert

回答

10
+1

'SELECT CONVERT(“2这不是数值”,UNSIGNED)'返回'2'。也许你可以把它添加到你的答案。 – Mike

+0

不喜欢。我想要0个结果 - 没有行的ID为“2yourmom”。当我说'WHERE id =“2yourmom”'时,我的意思是字面意思是id等于那个值。无论使用哪种语言,自动播放都会发生。无论如何...感谢您的链接:D –

+0

+1这个钉子的原因。 mysql中的隐式转换将在int后面删除非数字值,然后执行隐式转换。可怕的是我,但它在文档 – xQbert

相关问题