选择匹配整数上字符串的开头数

时间:2009-11-06 07:12:34

标签: mysql

我有这张桌子:

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中的解决方案将是“最纯粹的”。

2 个答案:

答案 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

来解决