json_search返回路径字符串而非布尔值,需用is not null判断存在性;search_str为纯字符串不加引号;path必须是合法json路径表达式;escape_char通常为null;one_or_all优先选'one'以提升性能。

JSON_SEARCH 返回的是路径字符串,不是布尔值
很多人误以为 JSON_SEARCH() 会直接返回 1 或 0,像 JSON_CONTAINS() 那样。它实际返回的是匹配项的 JSON 路径(如 "$[0]" 或 "$.name"),没找到就返回 NULL。所以判断“是否存在”必须写成 JSON_SEARCH(...) IS NOT NULL,而不是 = 1 或 != NULL。
搜索字符串时,search_str 参数不加引号
这是最容易出错的地方:JSON_SEARCH() 的第三个参数 search_str 是纯字符串字面量,不是 JSON 值。比如想查数组 ["a", "b", "c"] 里有没有 "b",要写 JSON_SEARCH(col, 'one', 'b'),而不是 '"b"' —— 后者会导致查不到,因为函数会在 JSON 中逐字符匹配 "b(带双引号的字符串)。
-
JSON_CONTAINS(col, '"b"')→ 正确:把"b"当作 JSON 字符串值比较 -
JSON_SEARCH(col, 'one', 'b')→ 正确:把b当作普通字符串搜索 -
JSON_SEARCH(col, 'one', '"b"')→ 错误:搜的是字面量"b,不是值b
限制搜索范围时,path 参数必须是合法 JSON 路径表达式
如果你只想在某个字段或数组里查,比如只查 info->'$.hobbies' 这个数组,path 参数不能传 info->'$.hobbies' 的结果(那是个 JSON 值),而必须传路径字符串 '$.hobbies':
JSON_SEARCH(info, 'one', 'coding', NULL, '$.hobbies')
注意两点:
- 路径必须以
$开头,支持$[*]、$.key、$[0]等标准语法 - 如果路径不存在(比如
'$.tags'但 JSON 里根本没有tags字段),整个函数返回NULL,不会报错 -
escape_char参数通常留NULL,除非你要搜含%或_的字符串且希望它们当字面量用
one_or_all 选 'one' 就够了,除非真要所有路径
绝大多数场景下,你只关心“有没有”,不需要知道有几个或在哪几个位置。用 'one' 更高效,因为 MySQL 找到第一个就停;用 'all' 会遍历完整个文档,返回一个 JSON 数组(如 ["$[0]", "$[2]"]),还得多一层 JSON_LENGTH() 或正则判断是否为空。
性能差异在大 JSON 文档或高频查询中会明显——尤其当数据量上万行、JSON 平均长度超 2KB 时,'one' 能稳定快 30% 以上。
真正需要 'all' 的情况极少,比如做数据清洗时要批量提取所有匹配路径再做后续处理。











