mysql 8.0 中不存在 json_overlays 函数,实际可用的是 json_merge_patch(rfc 7396 标准,支持递归合并与 null 删除)和 json_merge_preserve(非递归,同名键值转数组),二者均要求合法 json 输入。

MySQL 8.0 中没有 JSON_OVERLAYS 函数,它根本不存在。 你可能混淆了函数名,实际可用的是 JSON_MERGE_PATCH 和 JSON_MERGE_PRESERVE,它们才是 MySQL 原生支持的 JSON 合并函数。
为什么找不到 JSON_OVERLAYS?
官方文档、源码、所有已知发行版(包括 MySQL 8.0.13–8.4.x)均无此函数。搜索错误通常源于:拼写错误(如把 PATCH 误作 OVERLAYS)、混淆了 PostgreSQL 的 jsonb_overlay 或某些 ORM 封装的别名。
- 执行
SELECT JSON_OVERLAYS('{"a":1}', '{"b":2}');会直接报错:ERROR 1305 (42000): FUNCTION json_overlays does not exist - MySQL 只提供
JSON_MERGE_PATCH(RFC 7396 标准)和JSON_MERGE_PRESERVE(旧式合并) - 二者都要求所有参数是合法 JSON 值,否则触发
ERROR 3140(Invalid JSON text)
JSON_MERGE_PATCH 的行为和陷阱
它按 RFC 7396 实现“补丁式”合并:相同键名时后值覆盖前值;若值为对象,则递归合并;null 值表示“删除该键”。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
-
SELECT JSON_MERGE_PATCH('{"a":1,"b":2}', '{"b":3,"c":4}');→{"a": 1, "b": 3, "c": 4} -
SELECT JSON_MERGE_PATCH('{"x":{"y":1}}', '{"x":{"z":2}}');→{"x": {"y": 1, "z": 2}}(递归合并) -
SELECT JSON_MERGE_PATCH('{"a":1,"b":2}', '{"b":null}');→{"a": 1}(b被移除) - ⚠️ 若输入不是 JSON 类型(如普通字符串字段未用
CAST(... AS JSON)),会静默转为空 JSON{},而非报错
JSON_MERGE_PRESERVE 与 JSON_MERGE_PATCH 的关键区别
它不递归,也不支持 null 删除语义,而是简单“追加”同名键的值到数组中。
-
SELECT JSON_MERGE_PRESERVE('{"a":1,"b":2}', '{"b":3,"c":4}');→{"a": 1, "b": [2, 3], "c": 4}(b变成数组) -
SELECT JSON_MERGE_PRESERVE('{"x":1}', '{"x":2}');→{"x": [1, 2]} - 它不解析嵌套结构,
JSON_MERGE_PRESERVE('{"x":{"y":1}}', '{"x":{"z":2}}')→{"x": [{"y": 1}, {"z": 2}]} - 性能上二者接近,但语义差异极大,选错会导致业务逻辑错误
生产环境必须检查的三件事
合并操作看似简单,但在真实数据中极易出错:
- 确认字段类型是
JSON,或显式转换:JSON_MERGE_PATCH(CAST(col1 AS JSON), CAST(col2 AS JSON));否则字符串会被当作文本拼接 - 验证输入合法性:
WHERE JSON_VALID(col1) AND JSON_VALID(col2),避免整行被静默转为空对象 - 注意空值处理:若任一参数为
NULL,整个结果为NULL;需用COALESCE补默认值,例如JSON_MERGE_PATCH(COALESCE(col1, '{}'), COALESCE(col2, '{}'))
真正要合并 JSON 对象时,盯住 JSON_MERGE_PATCH 和 JSON_MERGE_PRESERVE 就够了。JSON_OVERLAYS 是个不存在的幻影,查不到就对了——删掉重输函数名,再核对一次文档链接里的函数列表。










