php - Mysql WHERE OR WHERE 以整数奇怪的结果开始

标签 php mysql

为什么是

$query = "SELECT * FROM `users` WHERE `id` = '$search' OR `email` = '$search' LIMIT 1";

`id` = UNSIGNED INTEGER(10), `email` = VARCHAR(255)

为什么查询结果如此奇怪,我认为图像是 self 解释的,但我也需要一些词,所以在这里,当用户搜索 dcm2@example.com 或其他任何不存在的东西时,没有结果,但是如果字符串以数字开头并搜索 PRIMARY KEY,它将字符串转换为整数,如果我搜索 2dcm1@example.com,则 ID 2 返回,任何好的解释以及为什么会这样?

enter image description here

enter image description here

enter image description here

最佳答案

这是因为每当运算符与不同类型的操作数一起使用时,MySql 会自动转换类型(假设您的 id 是整数列)。

参见 the official documentation :

When an operator is used with operands of different types, type conversion occurs to make the operands compatible. Some conversions occur implicitly. For example, MySQL automatically converts numbers to strings as necessary, and vice versa.

以及以下示例(从文档中复制):

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 代码中处理此类情况(如评论中所指出)。

关于php - Mysql WHERE OR WHERE 以整数奇怪的结果开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45220045/

相关文章:

mysql - Eloquent 查询只会准备,不会执行

php - 更新 mysql 表。一个字段 = old_value - 1

php - 配置更改后,MySQL 数据库中的 UTF-8 字符串变得困惑

php - Laravel 访问器、关系和预加载

java - 使用 jOOQ 从 CSV 导入日期

mysql - 从数据库查询中获取满足状态和 id 的间隔为 1 天的日期

php - Laravel 只加入最近的行

php - 使用 PDO 执行高级搜索查询的问题

php - 使用 shell_exec 从 usr/local/bin 执行 python3

PHP:将单个数组输出为多个列表