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() 仅作为临时或低频查询工具。