MySQL`WHERE`给出匹配0的未解决的结果

San*_*oob 6 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 
Run Code Online (Sandbox Code Playgroud)

表格内的数据

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
Run Code Online (Sandbox Code Playgroud)

SQL查询

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

此查询的结果

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*tin 5

似乎正在执行的比较是intint.

MySQL是转换文本user_namepassword一个int用于比较的目的.这里的MySQL文档表明varcharint在这种操作中转换为.

如果你看一下这个SQL小提琴,你会看到CONVERTuser_namepassword字段上使用它们int会输出0,从而使你的比较成真.

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

user_name = '0'
AND password = '0'
Run Code Online (Sandbox Code Playgroud)

很棒的问题顺便说一句!