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)
您的email列是a CHAR或VARCHAR类型.当您使用条件时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)
| 归档时间: |
|
| 查看次数: |
9052 次 |
| 最近记录: |