MySQL 5.7中JSON列使用WHERE IN语句未按预期生效问题
MySQL 5.7 JSON列IN语句失效的原因与解决办法
这个问题我之前也踩过坑,原因其实出在JSON值的提取类型上:
在MySQL 5.7中,使用->运算符提取JSON字段值时,返回的是带引号的JSON字面量(比如提取"2001"这个JSON字符串,结果会是"2001",包含双引号),而你IN子句里的"2001"、"1"是普通的字符串类型,两者类型不匹配,所以多值查询时无法匹配到结果。
至于单个值时能生效,大概率是MySQL的隐式类型转换刚好“蒙对了”,但这不是可靠的行为,多值场景下就会暴露问题。
解决办法很简单,用以下两种方式之一即可:
- 使用
->>运算符(它是JSON_UNQUOTE()的简写),直接提取不带引号的普通字符串:
select * from `user` where `profile`->>"$.year" IN ("2001", "1");
- 显式调用
JSON_UNQUOTE()函数,把->提取的JSON字面量转为普通字符串:
select * from `user` where JSON_UNQUOTE(`profile`->"$.year") IN ("2001", "1");
这两种方式都能保证提取的值和IN子句里的字符串类型一致,从而得到正确的查询结果。
内容的提问来源于stack exchange,提问作者Haibo Jiang
相关产品推荐
相关产品推荐

