为什么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”根本不是数字(至少不是十进制数字),因此转换应该会失败并出现错误。