我有这张桌子:
CREATE TABLE `test` (
`ID` int(11) NOT NULL auto_increment,
`text` varchar(250) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
内容:
ID text 1 70-and-some-text 70 blub
然后我执行此查询:
SELECT
*
FROM
test
WHERE
ID = '70-and-some-text'
OR
text = '70-and-some-text'
并获得两行。似乎MySQL试图匹配ID的数量,然后停止。我想我在某个地方看过,但再也找不到了。
答案和提示非常受欢迎。提前致谢。善待,我是新人。告诉我,如果我做错了什么。我非常尊重你们。
斯特芬
==================
感谢Tomalak,我现在知道问题的来源。处理这个问题的最佳做法是什么?我控制'文本',所以我可以使用PHP来获取'_70-and-some-text'或字符串。但MySQL中的解决方案将是“最纯粹的”。
答案 0 :(得分:7)
这一行
ID = '70-and-some-text'
使MySQL将右侧操作数转换为INT,因为该列的类型为INT。转换显然会导致数字70.您可以以字符串的形式将任何数据类型传递到MySQL查询中,MySQL会透明地执行必要的类型转换,就像在这种情况下一样。
答案 1 :(得分:2)
目前我无法指出在MySQL文档中是否描述了这种行为,但归结为以下几点。
MySQL尝试将发送到数字列(例如int,decimal)的任何数据解释为数字,无论是否有意义。即使是日期也可以解释为数字,或者如果MySQL无法确定传递的数据有用,只需存储0。
e.g。
INSERT INTO yourtable (intcolumn) VALUES (NOW()); //2009
INSERT INTO yourtable (intcolumn) VALUES ('aa'); //0
INSERT INTO yourtable (intcolumn) VALUES (12.12); //12
INSERT INTO yourtable (intcolumn) VALUES (12.8); //13 (!)
.....
我猜这种行为可以通过使用正确的MySQL Server Mode
来解决