MySQL 逗号分隔的字符串查询的集中方式
测试表:
CREATE TABLE users(id int(6) NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL,permission VARCHAR(50) NOT NULL, -- 权限PRIMARY KEY (id)
);INSERT INTO users(name, permission) VALUES('小张','1,2,12');
INSERT INTO users(name, permission) VALUES('小王','11,22,32');
FIND_IN_SET函数
查询包含2的数据
SELECT * FROM users WHERE FIND_IN_SET(2,permission);
查询结果:
LIKE关键字
用于判断一个字符串是否存在于由逗号分隔的字符串列表中,存在则返回位置索引(从1开始计数),不存在返回0。例如:SELECT FIND_IN_SET('b', 'a,b,c,d');
结果为2。
查询包含2的数据
select * from users where permission like '%2,%'
查询结果,发现有两条。不建议,并且性能较低
POSITION函数
判断子串在字符串中的位置,返回起始位置(若不存在则返回0)。例如:SELECT POSITION('abc' IN 'xyzabc');
结果为4。通常比LIKE
更高效,尤其在匹配模式固定时(如精确匹配某段文本)
类似还有locate。使用方式如下:
SELECT * FROM users WHERE position('2' in permission)>0;
查询结果
结论
综合对比,逗号分隔的字符串查询适合用find_in_set函数。如果是模糊匹配查询可以考虑使用like和position函数,无法使用索引时,position性能更优。