为什么 MySQL select 返回相同值的不同结果取决于它是否被引用

Why is MySQL select returning different result for the same value depending if it is quoted

在查询我的 table 产品时:

SELECT product_id FROM products WHERE product_id = 1701114;

结果我得到两行:1701114 和 1701114B。

但是加上单引号之后是这样的:

SELECT product_id FROM products WHERE product_id = '1701114';

我得到了预期的单行结果。

product_id 列是 VARCHAR 类型的主键,未加引号的值是数字,这可能是原因,但令人惊讶的是等号突然变成了 'LIKE'

product_id 是您的 table 中的一个字符串。但是 1701114 是一个整数。现在数据库做什么?它将 table 中的字符串转换为数字以进行比较。

要做到这一点 MySQL 从字符串的左到右开始,获取所有数字并将它们变成一个数字。剩下的就删了。

因此 '1701114B' 被转换为数字 1701114

第二个查询比较 2 个字符串,不需要转换。

您的列 product_id 是一个 varchar 列。将它与整数 (1701114) 而不是字符串 ('1701114') 进行比较是一个非常糟糕的主意。

发生的事情是 MySQL 默默地将 product_id 值转换为数字,以便将它们与 1701114 进行比较。 '1701114B' 不是数字,不应转换为数字,但在我看来会引发错误。然而,MySQL 开发人员决定从左到右并尽可能地进行转换。所以他们将 '1701114B' 转换为 1701114,因此出现了意外匹配。