为什么MySQL select会根据是否引用同一个值返回不同的结果

为什么MySQL select会根据是否引用同一个值返回不同的结果,mysql,select,quoting,Mysql,Select,Quoting,查询我的产品表时,如下所示: SELECT product_id FROM products WHERE product_id = 1701114; SELECT product_id FROM products WHERE product_id = '1701114'; 结果得到两行:1701114和1701114B 但在添加如下单引号后: SELECT product_id FROM products WHERE product_id = 1701114; SELECT product

查询我的产品表时,如下所示:

SELECT product_id FROM products WHERE product_id = 1701114;
SELECT product_id FROM products WHERE product_id = '1701114';
结果得到两行:1701114和1701114B

但在添加如下单引号后:

SELECT product_id FROM products WHERE product_id = 1701114;
SELECT product_id FROM products WHERE product_id = '1701114';
我得到了预期的单行结果


product\u id
列是
VARCHAR
类型的主键,不带引号的值是一个数字,这可能是原因,但令人惊讶的是,等号突然变为类似“like”的东西
product\u id
是表中的一个字符串。但是
1701114
是一个整数。现在DB做什么?它将表中的字符串转换为数字以进行比较

要做到这一点,MySQL从字符串的左到右开始,获取所有数字并将它们转换为数字。其余的都被切断了

因此,
'1701114B'
被转换成数字
1701114


第二个查询比较两个字符串,不需要进行任何转换。

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

要做到这一点,MySQL从字符串的左到右开始,获取所有数字并将它们转换为数字。其余的都被切断了

因此,
'1701114B'
被转换成数字
1701114


第二个查询比较两个字符串,不需要进行任何转换。

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


发生的情况是MySQL将
product\u id
值静默地转换为数字,以便与
1701114
进行比较<代码>'1701114B'不是数字,不应转换为数字,但在我看来,这会引起一个错误。然而,MySQL开发人员已经决定将其从左向右转换,并尽可能地进行转换。因此,它们将
'1701114B'
转换为
1701114
,因此出现了意外的匹配。

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


发生的情况是MySQL将
product\u id
值静默地转换为数字,以便与
1701114
进行比较<代码>'1701114B'不是数字,不应转换为数字,但在我看来,这会引起一个错误。然而,MySQL开发人员已经决定将其从左向右转换,并尽可能地进行转换。因此,他们将
'1701114B'
转换为
1701114
,因此出现了意外的匹配。

在我看来,搜索的数字值(在WHERE之后)应该转换为列类型(即VARCHAR),而不是反过来-这将给出预期的结果。符合标准,DBMS不关心两个操作数中是否有一个是列。它只是比较两个值,如果数据类型不匹配,则尽可能进行转换。将一个数字与一个字符串进行比较,人们希望1701114与“1701114”(当然)匹配,但也与代表相同数字的“01701114”匹配。因此,DBMS必须将字符串转换为数字才能进行此处所需的数字比较。我认为唯一的缺陷是“1701114B”只是没有数字(至少不是十进制数字),因此转换应该会失败并出现错误。我认为搜索的数字值(在WHERE之后)应该转换为列类型(即VARCHAR),而不是相反-这将给出预期的结果。符合标准,DBMS不关心两个操作数中是否有一个是列。它只是比较两个值,如果数据类型不匹配,则尽可能进行转换。将一个数字与一个字符串进行比较,人们希望1701114与“1701114”(当然)匹配,但也与代表相同数字的“01701114”匹配。因此,DBMS必须将字符串转换为数字才能进行此处所需的数字比较。我认为唯一的缺陷是“1701114B”根本不是数字(至少不是十进制数字),因此转换应该会失败并出现错误。