如何在MySQL中利用Find_In_Set函数处理逗号分隔的查询?

P粉602998670

P粉602998670

2026-06-18

297人浏览

原创

find_in_set()用于在逗号分隔字符串中精确匹配单个值并返回位置(从1开始),不支持空格、模糊匹配、索引加速,仅适用于低频、小数据量的简单枚举场景;设计上违反第一范式,大数据量或需扩展时应重构为关联表。

如何在mysql中利用find_in_set函数处理逗号分隔的查询?

Find_In_Set函数的基本用法和限制

FIND_IN_SET() 是 MySQL 提供的字符串查找函数,用于判断某个值是否出现在以逗号分隔的字符串中。它不支持模糊匹配、不走索引、不能处理空格或嵌套分隔符,只适用于简单、固定格式的枚举式存储场景。

常见错误现象:FIND_IN_SET('1', '1,2,3') 返回 1(正确),但 FIND_IN_SET('1', '10,11,12') 也返回 0(正确),而 FIND_IN_SET('1', '1, 2, 3') 返回 0——因为中间有空格,FIND_IN_SET() 不做 trim。

  • 第一个参数必须是纯字符串字面量或列值,不能是表达式(如 CONCAT('a', 'b')
  • 第二个参数必须是逗号分隔的字符串,不能是 NULL;若为 NULL,整个函数返回 NULL
  • 返回值是位置索引(从 1 开始),查不到返回 0,不是布尔值,注意 WHERE 条件中要写 > 0= 0

替代 LIKE 的模糊风险:为什么不要用 WHERE tags LIKE '%java%'

LIKE 查逗号分隔字段(如 tags VARCHAR(255) 存着 'python,java,go')极易误匹配:LIKE '%java%' 会命中 'javascript''ajava',而 FIND_IN_SET('java', tags) 只匹配完整项。

但要注意:如果数据里存的是 ' python , java , go '(带空格),FIND_IN_SET('java', tags) 仍失败。此时得先清洗:

WHERE FIND_IN_SET('java', REPLACE(REPLACE(tags, ' ', ''), '\t', '')) > 0

不过这种清洗代价高,且无法利用索引——本质上,这是在为设计缺陷打补丁。

MySQL(Linux)
MySQL(Linux)

MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。

下载

性能陷阱:FIND_IN_SET 为什么让查询变慢

FIND_IN_SET() 是逐行计算函数,MySQL 无法对它做索引下推。哪怕 tags 字段上有索引,执行 WHERE FIND_IN_SET('go', tags) 也会触发全表扫描。

  • 数据量超 1 万行后,响应明显延迟
  • EXPLAIN 显示 type: ALLkey: NULL
  • 如果同时有其他条件(如 AND status = 'active'),应确保这些条件能走索引,把结果集先压到最小再应用 FIND_IN_SET

更糟的是:它不能用于 ORDER BYGROUP BY 的优化场景,也没法和 IN 互换——FIND_IN_SET 只接受单个搜索值,不支持列表。

真正该怎么做:什么时候坚持用,什么时候必须重构

小项目、配置表、低频管理后台查询(比如后台筛选“拥有这 3 个标签的用户”),FIND_IN_SET() 快速可用,别过早否定它。

但只要出现以下任一情况,就该立刻停用并拆表:

  • 需要按标签统计(COUNT(*) GROUP BY tag
  • 标签数动态增长,单字段长度逼近 VARCHAR(255) 上限
  • 出现多对多关系(一个用户多个标签 + 一个标签多个用户)
  • 业务要求支持标签排序、启用/禁用、国际化等扩展属性

这时候正确的结构是三张表:userstagsuser_tags(含 user_idtag_id)。哪怕初期改起来麻烦,后面加 WHERE tag_name = 'go' AND u.status = 'active' 就能走联合索引,这才是可持续的。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

2450

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

448

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

614

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3966

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

1324

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

3540

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

3489

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

640

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

526

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 124人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 224人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习