MySQL使用LIKE语句搜索数据库JSON编码文本匹配失败问题
问题原因
- SQL语法中反斜杠是默认转义字符,你写的查询条件
%\u57fa\u672c%在解析时会把反斜杠标记为转义符,实际生效的匹配字符串是%u57fau672c%,和数据库中实际存储的包含反斜杠的\u57fa\u672c序列无法匹配。 - 你当前是直接对JSON编码后的原始字符串做模糊匹配,逻辑本身存在兼容性问题,只要JSON编码规则调整(比如部分字符直接存原字符而非Unicode转义),匹配就会失效。
解决方案
临时兼容方案(仅救急使用)
对查询中的反斜杠做二次转义,以MySQL为例,LIKE语法中匹配1个实际存储的反斜杠需要写4个反斜杠,修改后的查询如下:
SELECT p.* FROM Question p WHERE p.deletedAt IS NULL AND p.title LIKE '%\\\\u57fa\\\\u672c%' AND p.questionType=3;
长期最优方案
- 如果你使用的数据库支持JSON函数(MySQL 5.7+、PostgreSQL等都已支持),优先用JSON提取函数取出对应字段的值再匹配,完全规避转义问题,示例(MySQL):
SELECT p.* FROM Question p WHERE p.deletedAt IS NULL AND p.title->>'$.en' LIKE '%基本%' AND p.questionType=3;
- 性能优化建议:如果该字段的模糊查询频率很高,建议把JSON中需要检索的字段单独拆为普通列存储并加索引,查询性能远高于直接检索JSON字符串。
内容的提问来源于stack exchange,提问作者Dula
相关产品推荐
相关产品推荐

