我有一个使用非auto inc int作为主键的简单表。查询具有条件的表时,例如,where id='2,5,6'(无意中!)它返回一个结果集!好吧,行得通,但为什么?
kpbwa7wx1#
id 是一个整数,您可以将其与字符串进行比较 '2,5,6' . mysql将字符串转换为数字,以便比较两者。好, '2,5,6' 不是数字,其他dbms将抛出错误。但是mysql使用了另一种方法:它对每个字符进行转换,直到字符串结束或者字符不是数字。所以它看到了2,然后是逗号。根据您的设置,逗号是否是数字分隔符。所以mysql要么转换成2,要么转换成2.5。以下是有关mysql中隐式转换的文档:https://dev.mysql.com/doc/refman/5.5/en/type-conversion.html.关于如何将一个字符串转换成一个数字的算法在这里没有明确的描述,但是他们说例如有许多不同的字符串可以转换为值1,例如“1”、“1”或“1a”。他们在文档中还指出隐式转换是危险的,因为字符串不会转换为 DECIMAL (如我所想),但是对于近似的数据类型 DOUBLE . 所以在mysql中,我们应该避免从字符串到数字的隐式转换。
id
'2,5,6'
DECIMAL
DOUBLE
1条答案
按热度按时间kpbwa7wx1#
id
是一个整数,您可以将其与字符串进行比较'2,5,6'
. mysql将字符串转换为数字,以便比较两者。好,
'2,5,6'
不是数字,其他dbms将抛出错误。但是mysql使用了另一种方法:它对每个字符进行转换,直到字符串结束或者字符不是数字。所以它看到了2,然后是逗号。根据您的设置,逗号是否是数字分隔符。所以mysql要么转换成2,要么转换成2.5。以下是有关mysql中隐式转换的文档:https://dev.mysql.com/doc/refman/5.5/en/type-conversion.html.
关于如何将一个字符串转换成一个数字的算法在这里没有明确的描述,但是他们说例如
有许多不同的字符串可以转换为值1,例如“1”、“1”或“1a”。
他们在文档中还指出隐式转换是危险的,因为字符串不会转换为
DECIMAL
(如我所想),但是对于近似的数据类型DOUBLE
. 所以在mysql中,我们应该避免从字符串到数字的隐式转换。