MySQL JSON_SCHEMA_VALID 怎样校验 JSON 文档
如果一列 JSON 既要保留灵活性,又不能接受字段缺失或数值越界,MySQL 的 JSON_SCHEMA_VALID() 可以直接把 JSON Schema 变成一次布尔判断。它返回 1 表示文档通过,返回 0 表示文档不符合规则;参数为 NULL 时返回 NULL,而不是把空值当成合法文档。
- schema 放在第一个参数,待校验 JSON 文档放在第二个参数。
required负责字段是否存在,type、minimum、maximum负责值的形状和值域。- 只想看 1/0 用
JSON_SCHEMA_VALID(),需要定位失败字段就换成JSON_SCHEMA_VALIDATION_REPORT()。
MySQL JSON_SCHEMA_VALID 先把 schema 和文档放到同一个判断点
我更建议先用用户变量做一个小实验,再决定是否写进表约束。下面的规则要求文档是对象,并且必须同时有 latitude 与 longitude;纬度范围是 -90 到 90,经度范围是 -180 到 180。
-- 准备一个符合 Draft 4 语义的坐标对象规则
SET @schema = '{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"]}';
-- 待校验文档:两个必填字段都存在,数值也在边界内
SET @document = '{"latitude":31.23,"longitude":121.47}';
-- 返回 1 代表这份文档通过 schema
SELECT JSON_SCHEMA_VALID(@schema, @document) AS is_valid;
这个函数的两个参数都必须是合法 JSON,schema 还必须是合法的 JSON 对象。写成数组、字符串,或者把 JSON 拼坏,问题就不再是“校验不通过”,而是输入本身触发错误。

用 1、0、NULL 和错误区分四种结果
实际排查时最容易混淆的是“文档不符合规则”和“函数没有拿到可解析的输入”。可以用下面的对照表快速判断:
| 场景 | 结果 | 含义 |
|---|---|---|
| 字段齐全且值满足规则 | 1 | 验证通过 |
| 缺少 required 字段或值越界 | 0 | JSON 合法,但不符合 schema |
| 任一参数为 NULL | NULL | 输入为空,不能当作通过 |
| 参数不是合法 JSON,或 schema 不是对象 | 错误 | 先修复输入格式或 schema 类型 |
-- 缺少 longitude:这是合法 JSON,但不满足 required,所以返回 0
SET @document = '{"latitude":31.23}';
SELECT JSON_SCHEMA_VALID(@schema, @document) AS is_valid;
-- NULL 不代表校验通过;它表示至少一个参数为空
SELECT JSON_SCHEMA_VALID(@schema, NULL) AS is_unknown;
-- 需要注意:下面的字符串不是合法 JSON,函数会报错而不是返回 0
SELECT JSON_SCHEMA_VALID(@schema, '{"latitude":31.23') AS malformed_input;
生产代码里不要把 NULL 静默转换成 0 或 1。若业务要求“必须有 JSON”,应先对列本身设定 NOT NULL,再用 schema 约束内容;这样输入为空和内容不合规是两层不同的错误。
用验证报告定位失败字段,再决定是否加 CHECK
只返回 0 适合快速筛选,定位问题则调用 JSON_SCHEMA_VALIDATION_REPORT()。失败报告会给出 reason、schema-location、document-location 和失败的 schema 关键字。
-- 让经度越过 maximum,观察报告中的文档路径和规则路径
SET @document = '{"latitude":31.23,"longitude":181}';
-- JSON_PRETTY 只负责让报告更容易阅读
SELECT JSON_PRETTY(JSON_SCHEMA_VALIDATION_REPORT(@schema, @document)) AS report;
如果报告指出 document-location 是 #/longitude,而 schema-location 是 #/properties/longitude,就能直接知道是哪个字段撞上了哪条规则。这个报告比在应用层重新遍历 JSON 更适合做日志和接口错误提示。
确认规则稳定后,可以把 schema 内联到 CHECK 约束。MySQL 的 CHECK 约束不能引用变量,所以这里不能写 @schema:
-- 把规则内联到 CHECK,让写入阶段拒绝越界坐标
CREATE TABLE geo_point (
coordinate JSON NOT NULL,
CHECK (
JSON_SCHEMA_VALID(
'{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"]}',
coordinate
)
)
);
-- 这条写入会触发 CHECK 失败;SHOW WARNINGS 可查看更具体的 schema 原因
INSERT INTO geo_point (coordinate) VALUES ('{"latitude":91,"longitude":0}');
SHOW WARNINGS;

这套校验规则的适用边界
MySQL 文档说明这里采用 JSON Schema Draft 4 语义,支持 required、type 等属性,但不是把所有新版 JSON Schema 关键字都原样搬进数据库。外部资源不受支持,使用 $ref 会失败;正则 pattern 的非法表达式还可能被静默忽略,不能把它当成严格的正则审计器。
实践中我会把规则分两层:数据库只守住跨服务都必须成立的结构和值域,复杂的业务条件仍放在应用层,并把验证报告记录下来。这样既避免 JSON 列退化成无约束文本,也不会把每次业务变更都变成一条难维护的超长 CHECK。
常见问题
JSON_SCHEMA_VALID 返回 0,是 JSON 格式错误吗?
不是。返回 0 通常表示 JSON 本身可解析,但缺字段、类型不匹配或数值越过 schema 边界;非法 JSON 会直接报错。
为什么不直接用 JSON_VALID?
JSON_VALID() 只回答“能不能解析”,不回答字段是否存在、类型是否正确或数值是否在范围内。两者可以组合,但职责不同。
MySQL 13.4 容器排序为什么受字符集影响
- 上一篇
- MySQL 13.4 容器排序为什么受字符集影响
- 下一篇
- MySQL INET6_ATON 怎样把 IPv6 文本转成二进制
-
- 数据库 · MySQL | 42分钟前 |
- MySQL 锁等待超时怎样定位阻塞事务
- 325浏览 收藏
-
- 数据库 · MySQL | 43分钟前 | MySQL · mysql 时区 STR_TO_DATE 日期时间 CONVERT_TZ
- MySQL STR_TO_DATE 怎样处理带时区的日期字符串
- 117浏览 收藏
-
- 数据库 · MySQL | 49分钟前 | MySQL · 数据校验 · mysql IPv6 INET6_ATON INET6_NTOA VARBINARY
- MySQL INET6_ATON 怎样把 IPv6 文本转成二进制
- 207浏览 收藏
-
- 数据库 · MySQL | 57分钟前 |
- MySQL DECLARE HANDLER 怎样只处理 NOT FOUND 条件
- 160浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_GeomFromText 怎样把 WKT 文本转成空间对象
- 339浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL WITH ROLLUP 怎样生成小计和总计
- 107浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL REGEXP_LIKE 怎样判断字符串是否匹配正则
- 108浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL 派生表为什么阻止索引下推
- 412浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL optimizer hint 怎样临时禁止索引合并
- 325浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL performance_schema.setup_consumers 怎样开启长语句历史
- 332浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL JSON_CONTAINS_PATH 怎样判断 JSON 路径是否存在
- 399浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 851次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 855次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 936次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 910次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 739次使用
-
- MySQL JSON_TABLE 展开数组时如何保留缺失字段
- 2026-09-10 501浏览
-
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 2026-08-30 501浏览
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览

