MySQL 5.7.31中FIND_IN_SET返回空结果集的问题及解决方法
修复MySQL中FIND_IN_SET返回空结果的问题
问题原因
你的查询返回空结果,大概率是因为facilityList字段中的数据存在逗号后带空格的情况(比如实际存储的是'2, 3, 4'而非'2,3,4')。FIND_IN_SET函数会精确匹配每个分隔元素,带空格的' 3'和你传入的3无法匹配,导致无结果。
临时修复方案
方案1:去除字段中的所有空格
使用REPLACE函数清除facilityList里的空格后再匹配:
SELECT eastate_id FROM `eastate_facilitylist` WHERE FIND_IN_SET(3, REPLACE(facilityList, ' ', ''))
方案2:处理字段尾部填充空格(如果是CHAR类型)
如果facilityList是CHAR类型,可能存在尾部填充空格,用TRIM处理:
SELECT eastate_id FROM `eastate_facilitylist` WHERE FIND_IN_SET(3, TRIM(facilityList))
长期规范方案
逗号分隔字符串存储多值数据违反数据库设计范式,查询效率低且维护麻烦。建议拆分出关联表:
- 创建关联表
CREATE TABLE eastate_facility ( eastate_id INT, facility_id INT, PRIMARY KEY (eastate_id, facility_id) );
- 插入关联数据
INSERT INTO eastate_facility VALUES (1,2), (1,3), (1,4), (2,1), (2,3), (2,4), (3,1);
- 高效查询
SELECT DISTINCT eastate_id FROM eastate_facility WHERE facility_id = 3;
内容的提问来源于stack exchange,提问作者Hamidreza Norah
相关产品推荐
相关产品推荐

