为什么MySQL选择返回相同值的不同结果,具体取决于它是否被引用

时间:2016-11-08 09:13:01

标签: mysql select quoting

在查询我的产品表时:

SELECT product_id FROM products WHERE product_id = 1701114;

我得到两行:1701114和1701114B。

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

SELECT product_id FROM products WHERE product_id = '1701114';

我得到预期的单行结果。

product_id列是VARCHAR类型的主键,而未引用的值是数字,这可能是原因,但是相当令人惊讶的是,等号突然变为类似'LIKE'

2 个答案:

答案 0 :(得分:1)

product_id是表格中的字符串。但是1701114是一个整数。现在DB做了什么?它将表中的字符串转换为数字以进行比较。

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

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

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

答案 1 :(得分:1)

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

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