比较数字与逗号分隔的字符串时,MySQL的奇怪行为

时间:2018-09-10 13:33:20

标签: mysql sql string numbers comparison

我在使用MySQL时遇到一些奇怪的行为。基本上我有一个这样的表:

ID     string
1      14 
2      10,14,25

此查询为什么要提取ID 2?

SELECT * FROM exampletable where string = 10

当然应该在寻找完全匹配的内容,因为这只会提取ID 1:

SELECT * FROM exampletable where string = 14

我知道FIND_IN_SET,我觉得奇怪的是,第一个查询甚至没有提取任何内容。其行为类似于以下查询:

SELECT * FROM exampletable where string LIKE '10%'

1 个答案:

答案 0 :(得分:5)

当您比较数字和字符串值时,MySQL将尝试将字符串转换为数字并匹配。 也会解析数字之类的字符串 。我们有:

SELECT '10,14,25'      =   1     -- 0
SELECT '10,14,25'      =  10     -- 1
SELECT 'FOOBAR'        =   1     -- 0
SELECT 'FOOBAR'        =   0     -- 1
SELECT '123.456'       = 123     -- 0
SELECT '123.456FOOBAR' = 123.456 -- 1

行为是documented here(在您的示例中,这是最后一条规则):

  

...

     

如果参数之一是十进制值,则比较取决于   其他论点。如果参数是十进制值比较   其他参数是十进制或整数值,或作为浮点数   如果另一个参数是浮点值,则返回值。

     

在所有其他情况下,将参数作为浮点进行比较   (真实)数字。