首页 > 解决方案 > 将逗号分隔的字符串与数字进行比较时,MySQL 的奇怪行为

问题描述

我在使用 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%'

标签: mysqlsqlstringnumberscomparison

解决方案


当您比较数字和字符串值时,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

该行为记录在此处(在您的示例中,这是最后一条规则):

...

如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较,如果另一个参数是浮点值,则将其作为浮点值进行比较。

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


推荐阅读