MySQL`WHERE`为匹配0提供了意想不到的结果

时间:2014-03-14 09:09:07

标签: mysql sql select where

我有user_info表格描述如下

Field          Type         null Type        Extra
usr_id     int(11)           NO  PRI           auto_increment
f_name     varchar(50)       NO         
l_name     varchar(50)       YES            
user_name  Varchar(45)       NO         
password   varchar(128)      NO         
email      varchar(50)       NO         
type       enum('a','s','c') NO 

表格中的数据

0   admin   admin   admin   d033e22ae348aeb5660fc2140aec35850c4da997    admin@oww.com   a
1   staff   Staffer staff   d033e22ae348aeb5660fc2140aec35850c4da997    staff@oww.com   s
2   staff2  stafer  staff2  d033e22ae348aeb5660fc2140aec35850c4da997    staff2@oww.com  s
10  Shanoop Pattanath   shan123456  5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8    shan@shan.com   s

SQL查询

SELECT 
    *
FROM
    (`user_info`)
WHERE
    `user_name` = 0  -- wrong input 
        AND `password` = 0 -- wrong input
ORDER BY `usr_id`;

此查询的结果

0   admin   admin   admin   d033e22ae348aeb5660fc2140aec35850c4da997    admin@oww.com   a
1   staff   Staffer staff   d033e22ae348aeb5660fc2140aec35850c4da997    staff@oww.com   s
2   staff2  stafer  staff2  d033e22ae348aeb5660fc2140aec35850c4da997    staff2@oww.com  s

为什么这个查询与所有数据匹配?这个查询不应该给出任何结果,不是吗?我在这做错了什么?详细解答非常感谢 MySQL ver:5.5.35-0ubuntu0.13.10.2(Ubuntu)SQL FIddle

  

所有用户名,密码和电子邮件都只是虚构的

更新 我知道0必须在引号内。我这样解决了这个问题。但是为什么MySQL会提供这种有线输出。 ?

2 个答案:

答案 0 :(得分:5)

执行的比较似乎是intint

为了进行比较,MySQL正在将user_namepassword中的文本转换为int。 MySQL文档here表示在此类操作中varchar将转换为int

如果您查看此SQL Fiddle,您会看到使用CONVERTuser_name字段上的password生成int将输出0 ,从而使你的比较成真。

如果您要对两个varchar值进行比较,请确保使用单引号覆盖您的条件:

user_name = '0'
AND password = '0'

很棒的问题顺便说一句!

答案 1 :(得分:2)

选中fiddle

事情user_namevarchar0INT。 您无法比较INTString

通过练习你应该把它放在qoutes中:

`user_name` = '0'  -- wrong input 
 AND `password` = '0' -- wrong input

但是如果你想确保比较数据总是一个字符串。 您可以尝试以下方式:

 WHERE `user_name` = CAST(0 AS CHAR);

如果你愿意的话

SELECT *
FROM supportContacts
WHERE type = 1;

它不会返回任何东西。

为什么呢?这是因为它将您的列转换为整数。任何没有有效整数的字段都将等于0.您应该确保只将字符串字段与字符串值进行比较。