json_extract直接赋值或比较易出错,因其返回json类型值(如"张三")和null,需用->>或json_unquote提取裸值,并用json_contains_path判断键存在性。

直接用 JSON_EXTRACT 赋值或比较,大概率出错——不是函数失效,而是你没处理它的返回类型和 NULL 行为。
为什么存储过程里 JSON_EXTRACT 常“没反应”
根本原因是 MySQL 存储过程默认开启严格模式(sql_mode 包含 STRICT_TRANS_TABLES),而 JSON_EXTRACT 对非法路径、缺失 key 或非 JSON 值一律静默返回 NULL。这个 NULL 若直接赋给非 NULL 变量、参与数值运算或字符串比较,就会中断逻辑或产生不可预期结果。
-
SELECT JSON_EXTRACT('{"a":1}', '$.b')返回NULL,但SET v_age = JSON_EXTRACT(in_json, '$.age');后执行IF v_age > 18 THEN ...实际是在比较NULL > 18,结果恒为FALSE,条件永远不成立 - 路径写错(如写成
'$.user.name'但实际是'$.profile.name')也返回NULL,无报错,极难定位 -
JSON_EXTRACT返回的是 JSON 类型值,比如"张三"(带双引号),不是字符串张三;"25"不是整数25,直接用于计算会触发隐式转换,结果不稳定
提取值必须用 ->> 或 JSON_UNQUOTE(JSON_EXTRACT())
90% 的业务场景下,你要的是“裸值”,不是带引号的 JSON 字符串。硬编码 JSON_UNQUOTE 是安全底线,->> 是更简洁等价写法。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 正确:
SET v_name = in_json->>'$.name';或SET v_name = JSON_UNQUOTE(JSON_EXTRACT(in_json, '$.name')); - 错误:
SET v_name = JSON_EXTRACT(in_json, '$.name');→v_name存的是"张三",后续v_name = '张三'永远为FALSE - 数字同理:
in_json->>'$.age'得到可直接参与INT运算的纯数字;若漏掉->>,它还是 JSON 类型的25,在某些上下文会被当字符串处理 - 注意:
JSON_UNQUOTE(NULL)仍为NULL,不会报错,可放心使用
判断 key 是否存在不能只靠 IS NOT NULL
JSON_EXTRACT(in_json, '$.email') IS NOT NULL 无法区分“key 不存在”、“key 存在但值为 null”、“整个字段为 NULL”这三种情况,全返回 NULL。
- 检查 key 是否存在(不管值):
IF JSON_CONTAINS_PATH(in_json, 'one', '$.email') THEN - 检查 key 存在且值非
null:IF JSON_CONTAINS_PATH(in_json, 'one', '$.email') AND JSON_EXTRACT(in_json, '$.email') IS NOT NULL THEN - 别写成
IF in_json->'$.email' IS NOT NULL——->不脱壳,返回仍是 JSON 类型,IS NOT NULL判断无效
更新 JSON 字段优先用 JSON_REPLACE,慎用 JSON_SET
JSON_SET 在存储过程中有三个隐性风险:字段本身为 NULL 时结果仍是 NULL;路径不存在时强行新增键,破坏结构;并发写入无锁保护,可能覆盖他人修改。
- 更新前先校验:
IF JSON_VALID(in_json) THEN ... - 只改已有路径,不新增字段:用
JSON_REPLACE(in_json, '$.status', 'done') - 需原子递增(如计数器):
JSON_SET(in_json, '$.count', COALESCE(in_json->>'$.count', 0) + 1),避免先查后改竞态 - 追加数组元素:
JSON_ARRAY_APPEND(in_json, '$.tags', 'new_tag'),比拼接字符串可靠
最易被忽略的点是:所有 JSON 提取操作都默认静默失败,不报错也不提示。一旦路径写错或字段为空,逻辑就断在那儿了,还查不出原因。务必把 ->> 当成提取标配,把 JSON_CONTAINS_PATH 当成存在性判断唯一依据。










