从cloumn(varchar)= 0的表中选择* *选择所有数据

时间:2018-08-21 03:28:29

标签: mysql

每个人,在MySQL 5.7上执行选择查询时,都会发现奇怪的性能。

我的表(MySQL 5.7)

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '',
  `password` char(32) NOT NULL DEFAULT '',
  `age` int(11) DEFAULT NULL,
  `phone` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

我的SQL查询:

SELECT * FROM `user` WHERE name=0

结果

+------+--------+--------------------+-------+---------+
|   id | name   | payment_password   |   age |   phone |  
|------|--------|--------------------|-------|---------|  
|    1 | test1  |                    |    22 |   12345 |  
|    2 | test2  |                    |    15 |   12345 |  
|    3 | test3  |                    |    11 |   12345 |  
|    4 | test4  |                    |    11 |   12345 |  
+------+--------+--------------------+-------+---------+

有人可以解释为什么会这样吗?预先感谢!

2 个答案:

答案 0 :(得分:3)

就MySQL而言,转换为整数的字符串为0。请尝试以下操作:

SELECT CAST('test1' AS UNSIGNED), 'test1' = 0 

输出:

0    1

第二个输出值1表示MySQL认为'test'=0

答案 1 :(得分:0)

这是由于隐式类型转换而发生的。当一个运算符与不同类型的操作数一起使用时,将进行类型转换以使操作数兼容。一些转换是隐式发生的。例如,MySQL会根据需要自动将数字转换为字符串,反之亦然。

在您的情况下,当您使用WHERE name=0时,MySQL可能会在WHERE子句中看到算术运算,因为namevarchar类型的,并且在该列中隐式转换为整数。

您可以找到有关MySQL类型转换的更多详细信息HERE

Look Here