为什么
$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";
`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)
为什么查询结果如此奇怪,我认为图像是自我解释的,但我也需要一些词,所以在这里,当用户搜索dcm2@example.com或其他任何不存在时,没有结果,但如果字符串以数字开头并搜索PRIMARY KEY,它将字符串转换为整数,如果我搜索2dcm1@example.com,ID 2返回,任何良好的解释,为什么会发生这种情况?
答案 0 :(得分:4)
这是因为只要操作符与不同类型的操作数一起使用(假设您的id
是整数列),MySql就会自动转换类型。
请参阅with express 3/4:
当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。某些转换是隐式发生的。例如,MySQL会根据需要自动将数字转换为字符串,反之亦然。
以下示例(从文档中复制):
mysql> SELECT 1 > '6x';
-> 0
mysql> SELECT 7 > '6x';
-> 1
mysql> SELECT 0 > 'x6';
-> 0
mysql> SELECT 0 = 'x6';
-> 1
不幸的是,似乎没有配置来阻止这种行为(至少对SELECT
语句而言)。可能有效的方法是在id
列上进行明确投射:
mysql> SELECT CAST(6 AS CHAR) = '6x';
-> 0
mysql> SELECT CAST(6 AS CHAR) = 6;
-> 1
但是这仍然看起来很奇怪,因为它对整数列强制执行字符串比较。更好的方法可能是在你的php代码中处理这种情况(正如评论中所指出的那样)。