如何利用MySQL内置函数判断一个字符串是否为合法的JSON?

冬婷大大_1829

冬婷大大_1829

2026-06-20

1033人浏览

原创

mysql中快速验证字符串是否合法json应使用json_valid()函数,它返回1表示合法、0表示非法、null表示输入为null,不抛异常,适合where或check约束;而json_extract()和cast(... as json)遇非法json会报错中断执行。

如何利用mysql内置函数判断一个字符串是否为合法的json?

MySQL里怎么快速验证字符串是不是合法JSON?

直接用 JSON_VALID() 函数。它返回 1 表示合法,0 表示非法,NULL 表示输入为 NULL。这是 MySQL 5.7.8 起内置的最轻量、最可靠的判断方式,不需要解析或提取内容,只做语法校验。

为什么不能用 JSON_EXTRACT() 或 CAST(... AS JSON) 来判断?

这两个操作在遇到非法 JSON 时会直接报错(比如 Invalid JSON text),导致 SQL 中断,没法用于条件过滤或安全校验。而 JSON_VALID() 是纯函数式判断,不抛异常,适合放在 WHERE、CASE 或触发器里做前置检查。

  • JSON_EXTRACT('{"a":}', '$.a') → 报错:Invalid JSON text
  • CAST('{"a":}' AS JSON) → 同样报错,且在严格模式下会拒绝插入
  • JSON_VALID('{"a":}') → 安静返回 0,可安全参与逻辑运算

JSON_VALID() 的边界情况要注意什么?

它只校验 JSON 语法,不保证语义合理或字段存在。比如空对象 {}、空数组 []、数字 42、布尔值 true 都算合法;但带尾随逗号、单引号包裹的字符串、未转义的控制字符都会被判定为非法。

Json Repair Kit
Json Repair Kit

使用 Node.js 评估修复格式错误的 JSON,自动纠正尾随逗号、单引号、未加引号的键等常见问题,实现文件规范化。

下载
  • ✅ 合法:JSON_VALID('{"name":"Alice","age":30}') → 1
  • ✅ 合法:JSON_VALID('null') → 1(JSON 标准允许 null 字面量)
  • ❌ 非法:JSON_VALID("{'name':'Alice'}") → 0(单引号不合法)
  • ❌ 非法:JSON_VALID('{"name":"Alice",}') → 0(尾随逗号)
  • ⚠️ 注意:JSON_VALID('') → 0,空字符串不是合法 JSON

在 INSERT / UPDATE 场景中怎么防止非法 JSON 写入?

别依赖应用层校验,直接在数据库约束里用 JSON_VALID() 做 CHECK 约束(MySQL 8.0.16+ 支持)。这样非法数据根本进不来,比触发器更高效、更可靠。

CREATE TABLE posts (
  id INT PRIMARY KEY,
  metadata TEXT,
  CHECK (JSON_VALID(metadata))
);

如果用的是老版本 MySQL(JSON_VALID() 判断后再执行写入——但得记住:CHECK 约束是唯一能真正阻止非法 JSON 入库的机制,其他方式都可能被绕过。

真正容易被忽略的是:JSON 字段类型(JSON)本身会自动校验,但如果你存的是 TEXT 或 VARCHAR,就完全不校验,哪怕内容是乱码也照存不误。所以选什么字段类型,决定了你是否需要手动加 JSON_VALID()。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql json js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2333

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1419

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

835

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3272

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5548

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1219

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5831

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

5062

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6774

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 190人学习