MySQL与MariaDB的JSON_SEARCH函数返回结果差异及适配方案求解
问题原因
MySQL 8.0 对 JSON_SEARCH 函数的参数类型匹配要求远严格于 MariaDB:原 SQL 中第三个搜索参数是字符串类型的 '123',但目标 JSON 中的对应值是数值类型的 123,类型不匹配导致搜索失败返回 NULL,MariaDB 内部做了隐式类型兼容,因此可以正常返回结果。
适配方案
最简洁的修改方式是去掉搜索参数的单引号,将搜索值改为数值类型即可和 MySQL 8.0 的类型匹配规则对齐:
SELECT JSON_SEARCH('[12, 13, {"12": 123}]', 'one', 123, null, '$[*]') path;
执行后返回结果为 "$[2].\"12\"",和预期的 "$[2].12" 是完全等价的合法 JSON 路径,实际使用时无差异。
如果需要返回和 MariaDB 完全一致的不带多余转义引号的结果,可以外层套一层 JSON_UNQUOTE 函数:
SELECT JSON_UNQUOTE(JSON_SEARCH('[12, 13, {"12": 123}]', 'one', 123, null, '$[*]')) path;
执行后输出为 $[2]."12",和 MariaDB 运行结果完全一致。
内容的提问来源于stack exchange,提问作者Slava Rozhnev
相关产品推荐
相关产品推荐

