惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
V
V2EX
博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Announcements
Recent Announcements
博客园 - 司徒正美
Microsoft Security Blog
Microsoft Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Latest news
Latest news
Vercel News
Vercel News
The Register - Security
The Register - Security
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
N
Netflix TechBlog - Medium
WordPress大学
WordPress大学
小众软件
小众软件
L
Lohrmann on Cybersecurity
GbyAI
GbyAI
P
Privacy & Cybersecurity Law Blog
T
Tor Project blog
AWS News Blog
AWS News Blog
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
K
Kaspersky official blog
B
Blog RSS Feed
G
Google Developers Blog
量子位
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
Intezer
雷峰网
雷峰网
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
F
Full Disclosure
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 【当耐特】
The Hacker News
The Hacker News
U
Unit 42
S
SegmentFault 最新的问题
I
InfoQ
aimingoo的专栏
aimingoo的专栏
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
罗磊的独立博客
Spread Privacy
Spread Privacy
C
CERT Recently Published Vulnerability Notes

博客园 - koushr

hls k8s常用命令 k8s 1.18.0安装 group by的列、where的列的有效性 go基础第六篇:sync包 doris脚本 es es语法 veo ride nacos 枫叶互动 极光矩阵 富途 移卡科技 nginx高可用 k8s第一篇:k8s集群架构组件 架构设计第二篇:支付模块架构设计 可观测性体系设计第一篇:可观测性体系基本概念 架构设计第一篇:点赞模块功能设计 ES高级第一篇:倒排索引 山海星辰 python第一篇:基础语法 pulsar基础第二篇:命令行 pulsar基础第一篇:pulsar安装及基本概念 clickhouse第三篇:安装 clickhouse第二篇:MergeTree引擎 clickhouse第一篇:引擎 redis高阶第一篇:令牌桶算法限流 http2.0 gin入参多次获取 docker第二篇:docker安装常用中间件
mysql json函数
koushr · 2026-05-21 · via 博客园 - koushr

mysql的json类型

create table if not exists products (id int auto_increment primary key, details json);

json类型字段可以指定为not null,但不能指定默认值。事实上,一共有4种类型不能指定默认值,分别是blob、text、geometry、json。

json类型字段在插入时会校验数据是否是json格式,如果不是的话,插入时会报错。varchar类型字段,如果存的是json格式的字符串,那么同样可以使用各种json函数,如果不是json格式字符串,那么使用json函数会报错。json格式既包括json对象格式,如'{"x":1}',又包括json数组格式,如'[{"x":1},{"x":2}]'。

初始化数据:

insert into products (details) values ('{"tags":["tag1","tag2","tag3"]}'),('{"tags":["tag1","tag4","tag5"]}');

插入json数据和插入varchar数据一样,都要用单引号包住。

1、json_object

构造一个json对象。语法是

json_object(key, value[, key2, value2, ...])

key和value是成对出现的,如果key有重复,那么后面的key-value会覆盖前面的key-value。

select json_object('name', 'Jim', 'age', 20),会返回{"age": 20, "name": "Jim"}

json_object可以嵌套,如select json_object('name', 'Tim', 'age', 20, 'friend', json_object('name', 'Jim', 'age', 20)),会返回{"age": 20, "name": "Tim", "friend": {"age": 20, "name": "Jim"}}

2、json_array

构造一个json数组。语法是

json_array(value1[, value2, ...])

元素可能会自动转换,如TRUE被转换为true,FALSE被转换为false,NULL被转换为null,日期、时间、日期时间被转换为字符串。

如select json_array(1,2,3)会返回[1,2,3]

select json_array(TRUE,FALSE,NULL),会返回[true, false, null, "2026-05-25", "15:12:10.000000", "2026-05-25 15:12:10.000000"]

json_array可以嵌套,如select json_array(json_array(123,456),json_array("abc","def")),会返回[[123,456],["abc","def"]]

select json_array(json_object('name','Jim','age',20),json_object('name','Tim','age',18)),会返回

select json_contains(json_array(1,2,3),'3'),会返回1

3、json_valid

校验入参是否是json文档,语法是

json_valid(str)

如果参数为null,则会返回null。否则,如果是一个有效的json文档,就返回1,如果不是,就返回0。

select json_valid(10),返回0。

select json_valid('"10"'),返回1。

select json_valid(true),返回0。

select json_valid('true'),返回1。

select json_valid('abc'),返回0。

select json_valid('"abc"'),返回1。

select json_valid('{"x":1}'),返回1。

select json_valid('{a:1}'),返回0。

4、json_type

返回给定的json值的类型,语法是

json_type(json_value)

如果参数为null,则将返回null,否则将返回一个字符串,可选项有:

OBJECT,表示json值是一个json对象。如select json_type(json_object('x', 1, 'y', 2))

ARRAY,表示json值是一个json数组。如select json_type(json_array(1, 2, 3))

BOOLEAN,表示json值是一个json布尔值。如select json_type('true')

NULL,表示json值是json null值。如select json_type('null')

INTEGER,表示json值是一个json。如json_type('5')

DOUBLE,如select json_type('5.0')

STRING,如select json_type('"5"')

DECIMAL

DATETIME

DATE

TIME

BLOB

OPAQUE,其他情况

5、json_contains

判断json对象格式的文档是否包括某个键值对,或者json数组格式的文档是否包含某个元素。语法是

json_contains(target_json, candidate_json[, path])

path是一个路径表达式,如果提供了path参数,则会检查path匹配的部分是否包含candidate_json,否则会检查target_json是否包含candidate_json。

如果target_json或者candidate_sjon为null,或者path指定的部分不存在,则会返回null。

select json_contains('{"x":1,"y":2}','{"x":1}'),返回1,表示包含。

select json_contains('{"x":1,"y":2}','{"x":2}'),返回0

select json_contains('{"x":1,"y":[2,3],"z":[4,5]}','4','$.z'),返回1。通过$.z指定从json对象的z属性值中查找,即从[4,5]中查找。

select json_contains('[1,2,3]','1'),返回1

select json_contains('[1,2,3]','"2"'),返回0

select json_contains('[1,2,[3,4]]','2','$[2]'),返回0。通过$[2]指定从json数组的第三个元素中找,即从[3,4]中查找。

6、json_contains_path

判断一个json文档在指定的路径上是否有值存在,语法是

json_contains_path(json, one_or_all, path[, path, ...])

one_or_all,要么是'one',要么是'all',如果是one的话,那么只要任一路径有值,就返回1。如果是all,则全部路径都有值时,才返回1。

path是路径表达式,至少要指定一个路径表达式。

如果有参数为null,则会返回null。

select json_contains_path('[1, 2, {"x": 3}]', 'one', '$[1]'),判断json数组是否有第二个元素,返回1。

select json_contains_path('[1, 2, {"x": 3}]', 'one', '$[2].x'),判断json数组第三个元素是否有x属性,返回1。

select json_contains_path('[1, 2, 3]', 'one', '$[2]', '$[3]'),判断json数组是否有第三个元素或者是否有第四个元素,返回1。

select json_contains_path('[1, 2, 3]', 'all', '$[2]', '$[3]'),判断json数组是否有第三个元素以及是否有第四个元素,返回0,因为没有第四个元素。

7、json_extract

返回json文档中指定路径的值,语法是

json_extract(json, path[, ...])

json文档可以是json对象,也可以是json数组。如果路径表达式匹配了一个值,就返回该值。如果路径表达式匹配了多个值,或者有多个路径表达式,则会返回一个json数组。

select json_extract('{"x": 1, "y": 2}', '$.x'),返回1,是json integer类型。

select json_extract('{"x":1, "y":2, "z":3}', '$.x', '$.z'),返回[1, 3],是json数组类型。

select json_extract('[1, 2, 3]', '$[0]'),返回1,是json integer类型。

select json_extract('[1, 2, 3]', '$[0]', '$[2]'),返回[1, 3],是json数组类型。

select json_extract('[1, 2, {"x": 1}]', '$[2]'),返回{"x": 1},是json对象类型。

select json_extract('[1, 2, {"x": 3}]', '$[2].x', '$[1]'),返回[3, 2],是json数组类型。

8、json_value

返回json文档中指定路径的值。返回的不是json类型,而是标量sql类型。语法是

json_value(json, path returning type [on_empty] [on_error])

type的可选项有float、double、decimal、signed、unsigned、date、time、datetime、year、char、json。没有int,如果想返回整数,可以用signed、unsigned,前者表示整数,后者表示正整数。没有varchar,如果想返回字符串,可以用char。

select
json_extract('[10000,"2025-09-09 12:12:12",30000]','$[1]'),
json_extract('[10000,"2025-09-09 12:12:12",30000]','$[1]', '$[2]'),
json_value('[10000,"2025-09-09 12:12:12",30000]','$[1]' returning char)
from t limit 1

json_value等价于cast(json_unquote(json_extract(json_doc, path)) as type),是后者的简写。

9、json_overlaps

检测两个json文档是否有交集,如两个json对象是否有相同的键值对,两个json数组是否有相同元素。语法是

json_overlaps(json1, json2)

如果有参数为null,则会返回null。否则,

比较两个json对象时,如果有相同的键值对,则返回1,否则返回0。

比较两个json数组时,如果有相同的元素,则返回1,否则返回0。

比较两个纯值时,如果两个值相同,则返回1,否则返回0。

比较纯值和json数组时,如果值是这个数组中的元素,则返回1,否则返回0。

比较纯值和json对象的结果为0,比较json对象和json数组的结果为0。

select json_overlaps('{"x": 1, "y": 2}', '{"x": 2, "y": 3}'),返回0。

select json_overlaps('{"x": 1, "y": 2}', '{"x": 2, "y": 2}'),返回1。

select json_overlaps('[1, 2, 3]', '[3, 4, 5]'),返回1。

select json_overlaps('1', '1'),返回1。

select json_overlaps('1', '[1, 2, 3]'),返回1。

json_overlaps函数不会对参数的数据类型进行转换,如select json_overlaps('1', '"1"'),返回0。

10、json_search

返回一个给定字符串在一个json文档中的路径。语法是

json_search(json, one_or_all, search_str[, escape_char[, path]])

one_or_all,值是'one'或者'all'。如果是'one',则会返回第一个匹配的路径 ,否则会把所有匹配的路径包装在一个数组内返回。

search_str可以使用%或_通配符。%可以匹配任意数量的任意字符,_可以匹配一个任意字符。

如果有参数为null,或者未搜索到指定的字符串,或者指定的path不存在,则json_search函数会返回null。

select json_search('[1, 2, 3, 4]', 'one', '1'),返回null。

select json_search('["1", 2, 3, 4]', 'one', '1'),返回"$[0]"。

select json_search('{"name": "Tim", "hobbies": [{"name": "TikTok", "year": 10}]}', 'one', 'Tim'),返回"$.name"。

select json_search('{"name": "Tim", "hobbies": [{"name": "TikTok", "year": 10}]}', 'all', 'T%'),返回["$.name", "$.hobbies[0].name"]。

还有其他json函数,不一一列举,使用时可以参考https://dev.mysql.com/doc/refman/8.4/en/json-search-functions.html