MySQL 中的 FIND_IN_SET()
函数用于在逗号分隔的字符串列表中查找指定值的位置。以下是其详细用法和注意事项:
FIND_IN_SET(str, strlist)
0
。NULL
,返回 NULL
。基本查找
查找 'banana'
在列表 'apple,banana,orange'
中的位置:
SELECT FIND_IN_SET('banana', 'apple,banana,orange'); -- 返回 2
未找到的情况
SELECT FIND_IN_SET('grape', 'apple,banana,orange'); -- 返回 0
处理空字符串或 NULL
SELECT FIND_IN_SET('', 'apple,,orange'); -- 返回 2(匹配空元素)
SELECT FIND_IN_SET(NULL, 'apple,banana'); -- 返回 NULL
区分大小写
结果取决于字符集的校对规则(如 utf8_general_ci
不区分大小写):
SELECT FIND_IN_SET('B', 'a,b,c'); -- 可能返回 2(校对不区分大小写时)
查询逗号分隔的字段
假设表 products
的 category_ids
字段存储逗号分隔的分类 ID(如 '1,3,5'
),查找分类 3 的产品:
SELECT * FROM products WHERE FIND_IN_SET('3', category_ids) > 0;
FIND_IN_SET()
无法使用索引,数据量大时效率低。建议避免将多值存储在单个字段中,改用关联表(满足数据库规范化)。str
包含逗号,函数无法正确匹配(如查找 'a,b'
时,列表需存在 'a,b'
作为独立元素)。'a, b'
中的 ' b'
需明确匹配)。products
表 + product_categories
表),结合 JOIN
提升性能。FIND_IN_SET()
仅作为临时或低频查询工具。