【发布时间】:2012-06-14 02:19:48
【问题描述】:
给定表格:
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"(一空格二)变为 1。
任何解释此行为的文章或文档将不胜感激。
【问题讨论】:
-
doens't mysql 使用 ' 而不是 " 来表示字符串?它可能只是在查看数字值尝试将其隐式转换为数字,然后截断非数字值。所以...为什么哦,为什么!:D 您是否在数值字段中使用引号来强制它进行隐式转换?不用说,我也认为这是奇怪的行为。
-
要么。我总是用单引号来写代码,所以我总是给 sql 发送双引号
-
我想知道如果在选择中将字符串隐式转换为 bigint 会得到什么结果。如果你得到 2... 那么这是隐式转换,我的 o my 是 ODD 行为。
-
再一次……你为什么要使用引号?
-
在实际代码中,查询是由一个函数组装的,该函数将所有列名包装在反引号 (`) 中,并将所有值包装在引号中。显然,这个功能不能继续使用——自动施法令人沮丧。