我有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会提供这种有线输出。 ?
答案 0 :(得分:5)
执行的比较似乎是int
到int
。
为了进行比较,MySQL正在将user_name
和password
中的文本转换为int
。 MySQL文档here表示在此类操作中varchar
将转换为int
。
如果您查看此SQL Fiddle,您会看到使用CONVERT
和user_name
字段上的password
生成int
将输出0 ,从而使你的比较成真。
如果您要对两个varchar
值进行比较,请确保使用单引号覆盖您的条件:
user_name = '0'
AND password = '0'
很棒的问题顺便说一句!
答案 1 :(得分:2)
选中fiddle。
事情user_name
是varchar
而0
是INT
。
您无法比较INT
和String
。
通过练习你应该把它放在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.您应该确保只将字符串字段与字符串值进行比较。