带字符串搜索的MySQL整数列返回无效结果

时间:2016-08-03 11:23:28

标签: mysql

任何人都可以帮助我理解MySQL选择查询行为并帮助我解决这个问题,

如何根据用户搜索显示未找到结果的消息?

表格结构:

CREATE TABLE `dummytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mobile` int(11) NOT NULL,
  `welcome` varchar(150) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

enter image description here

问题:为什么我会收到这个结果?

SELECT * FROM `dummytable` WHERE `mobile` = '\'\'' LIMIT 50


enter image description here

3 个答案:

答案 0 :(得分:2)

mobile被声明为整数。当MySQL将整数与字符串进行比较时,它会将字符串转换为数字 - 而不是相反。

MySQL如何做到这一点?它将前导数字字符转换为数字。你的条件是:

WHERE mobile = ''''

(将单个引号放入字符串的传统SQL方法是将其加倍。)

单引号不是数字字符,因此转化结果为0。因此,这就是你得到的结果。

答案 1 :(得分:1)

您的列mobil是一个整数列。所以一切都转换为int。一个空字符串被转换为0(并且任何其他不以数字开头的字符串也将被转换为零我认为)

答案 2 :(得分:1)

执行此查询后,MySQL会向您显示一条警告消息:

mysql> select * from foo where bar_integer='\'\''

....

10 rows in set, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'okay' |
+---------+------+------------------------------------------+

MySQL试图将你的字符串值转换为目标类型(整数),如果转换失败,mysql会将其interprites为0,这会导致你看到的结果。

如果启用MySQL严格模式,此查询将产生错误,而不是进行此隐式转换。