当field = 0时,mySQL返回所有行

AFR*_*FRC 18 mysql select where-clause

我正在进行一些测试,当我查询表时,这是一个惊喜,查询SELECT * FROM table WHERE email=0返回表中的所有行.

此表没有"0"值,并且填充了常规电子邮件.

为什么会这样?这可能导致严重的安全问题.

有没有办法在不修改查询的情况下避免这种情况?

我错过了什么吗?

谢谢.

Kib*_*bee 23

这是因为它将电子邮件字段(我假设是一个varchar字段)转换为整数.任何没有有效整数的字段都将等于0.您应该确保只将字符串字段与字符串值进行比较(日期相同,与日期比较).查询应如下所示.

SELECT * FROM table WHERE email='0';
Run Code Online (Sandbox Code Playgroud)

  • 你认为mysql应该这样工作吗?我认为这是容易引入错误的地方.我不明白为什么它需要这样做没有意义转换,如将任何字符串转换为0.为什么不能更好地将0转换为'0' - 它会更有意义 (5认同)

Mic*_*ski 6

您的email列是a CHARVARCHAR类型.当您使用条件时email = 0,MySQL email会将列的内容转换为整数,以便将它们与您提供的0进行比较.如果您用引号括起0,查询将按预期工作.(email = '0')

在MySQL中将非数字字符串转换为整数将导致0.

mysql> SELECT CAST('email@example.com' AS SIGNED);
+-------------------------------------+
| CAST('email@example.com' AS SIGNED) |
+-------------------------------------+
|                                   0 |
+-------------------------------------+
Run Code Online (Sandbox Code Playgroud)

相反,如果您使用数字字符串尝试相同的操作,它们可能会正确转换:

mysql> SELECT CAST('12345' AS SIGNED);
+-------------------------+
| CAST('12345' AS SIGNED) |
+-------------------------+
|                   12345 |
+-------------------------+
Run Code Online (Sandbox Code Playgroud)