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会提供这种有线输出.?
似乎正在执行的比较是int
对int
.
MySQL是转换文本user_name
和password
一个int
用于比较的目的.这里的MySQL文档表明varchar
将int
在这种操作中转换为.
如果你看一下这个SQL小提琴,你会看到CONVERT
在user_name
和password
字段上使用它们int
会输出0,从而使你的比较成真.
如果您要对两个varchar
值进行比较,请确保使用单引号覆盖您的条件:
user_name = '0'
AND password = '0'
Run Code Online (Sandbox Code Playgroud)
很棒的问题顺便说一句!