mysql 中 FIND_IN_SET()函数


MySQL 中的 FIND_IN_SET() 函数用于在逗号分隔的字符串列表中查找指定值的位置。以下是其详细用法和注意事项:

函数语法

FIND_IN_SET(str, strlist)
  • str:要查找的字符串。
  • strlist:逗号分隔的字符串列表。
  • 返回值
    • 如果找到,返回字符串在列表中的位置(从 1 开始)。
    • 如果未找到,返回 0
    • 如果任一参数为 NULL,返回 NULL

使用示例

  1. 基本查找 查找 'banana' 在列表 'apple,banana,orange' 中的位置:

    SELECT FIND_IN_SET('banana', 'apple,banana,orange'); -- 返回 2
    
  2. 未找到的情况

    SELECT FIND_IN_SET('grape', 'apple,banana,orange'); -- 返回 0
    
  3. 处理空字符串或 NULL

    SELECT FIND_IN_SET('', 'apple,,orange');   -- 返回 2(匹配空元素)
    SELECT FIND_IN_SET(NULL, 'apple,banana'); -- 返回 NULL
    
  4. 区分大小写 结果取决于字符集的校对规则(如 utf8_general_ci 不区分大小写):

    SELECT FIND_IN_SET('B', 'a,b,c'); -- 可能返回 2(校对不区分大小写时)
    

应用场景

  • 查询逗号分隔的字段 假设表 productscategory_ids 字段存储逗号分隔的分类 ID(如 '1,3,5'),查找分类 3 的产品:

    SELECT * FROM products WHERE FIND_IN_SET('3', category_ids) > 0;
    

注意事项

  1. 性能问题 FIND_IN_SET() 无法使用索引,数据量大时效率低。建议避免将多值存储在单个字段中,改用关联表(满足数据库规范化)。
  2. 特殊字符处理
    • str 包含逗号,函数无法正确匹配(如查找 'a,b' 时,列表需存在 'a,b' 作为独立元素)。
    • 列表中的空格敏感(如 'a, b' 中的 ' b' 需明确匹配)。
  3. 替代方案 对高频查询,建议使用多对多关联表(如 products 表 + product_categories 表),结合 JOIN 提升性能。

总结

  • 适用场景:快速查询小规模逗号分隔数据。
  • 缺点:性能差,不符合数据库设计规范。
  • 最佳实践:优先使用规范化设计,FIND_IN_SET() 仅作为临时或低频查询工具。
知识点
Mysql