任何人都可以帮助我理解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
问题:为什么我会收到这个结果?
SELECT * FROM `dummytable` WHERE `mobile` = '\'\'' LIMIT 50
答案 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严格模式,此查询将产生错误,而不是进行此隐式转换。