为什么 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
,因此出现了意外匹配。
在查询我的 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
,因此出现了意外匹配。