MySQL-JSON相关函数

129 阅读4分钟

在MySQL8.0及以上版本中,你可以使用JSON相关函数来处理JSON 类型的字段,包括字段定义类型是JSON、字段定义类型是varchar,但是值以json串的形式存储这两种情况。

一、JSON方法总览

方法描述开始版本
->计算完成后从JSON列返回值。等同于JSON_EXTRACT().
->>计算完成后从JSON列返回值,并且将该值结束引用。等同于JSON_UNQUOTE(JSON_EXTRACT()).
JSON_ARRAY()创建JSON数组
JSON_ARRAY_APPEND()追加到JSON数组中
JSON_ARRAY_INSERT()插入到JSON数组中
JSON_CONTAINS()是否JSON串中存在path中指定的对象
JSON_CONTAINS_PATH()是否JSON串中存在path中的任何数据
JSON_DEPTH()JSON串的最大深度
JSON_EXTRACT()返回JSON串中的数据
JSON_INSERT()插入到JSON串中
JSON_KEYS()返回JSON串中的key数组
JSON_LENGTH()返回JSON串中的元素数量
JSON_MERGE_PATCH()合并JSON,重复的key的值会被覆盖
JSON_MERGE_PRESERVE()合并JSON,保留重复的key
JSON_OBJECT()创建JSON OBJECT
JSON_OVERLAPS()比较两个JSON,如果有任意一个键值对或者元素相同,则返回true,否则返回false8.0.17
JSON_PRETTY()格式化JSON
JSON_QUOTE()quote JSON
JSON_REMOVE()从JSON中删除数据
JSON_REPLACE()替换JSON串中的值
JSON_SCHEMA_VALID()校验JSON是否符合JSON SCHEMA的规范。符合返回true,否则返回false8.0.17
JSON_INSERT()插入到JSON串中
JSON_KEYS()返回JSON串中的key数组
JSON_LENGTH()返回JSON串中的元素数量
JSON_MERGE_PATCH()合并JSON,重复的key的值会被覆盖
JSON_MERGE_PRESERVE()合并JSON,保留重复的key
JSON_OBJECT()创建JSON对象
JSON_OVERLAPS()比较两个JSON内容,如果有任一键值对相同或者元素相同返回true(1),否则返回false(0)。8.0.17
JSON_PRETTY()JSON格式化
JSON_QUOTE()引用JSON 内容
JSON_REMOVE()将数据用JSON串中删除
JSON_REPLACE()替换JSON串中的值(value)
JSON_SCHEMA_VALID()验证JSON文档是否符合JSON Schema。符合返回true(1),否则返回false(0)。
JSON_SCHEMA_VALIDATION_REPORT()验证JSON文档是否符合JSON Schema。返回结果以JSON格式呈现,包括成功或者失败的结果,以及失败的原因。
JSON_SEARCH()在JSON文章中查询
JSON_SET()在JSON文章中插入数据
JSON_STORAGE_FREE()在部分更新后释放JSON列值的二进制表示形式中的空间
JSON_STORAGE_SIZE()用于存储JSON文档的二进制表示的空间
JSON_TABLE()以关系表的形式从JSON表达式返回数据
JSON_TYPE()JSON的值的类型
JSON_UNQUOTE()不引用JSON值
JSON_VALID()JSON的值是否有效
JSON_VALUE()从JSON文档中提取通过提供的path位置指向的值,以VARCHAR(512)或者指定类型返回值8.0.21
MEMBER_OF()如果第一个操作数匹配作为第二个操作数的JSON数组中的任何元素,返回true(1),否则返回false(0)。8.0.17

我们现在要定义表json_test。可以看到,字段content和content_json是两种类型,但是他们存的值都是一样的。

create table json_test
(
    id           bigint auto_increment comment 'id'
        primary key,
    name         varchar(20)                        null,
    content      varchar(500)                       null,
    content_json json                               null,
    create_time  datetime default CURRENT_TIMESTAMP null
)

下面让我们对这张表进行各种操作吧。

一、查询JSON类型的字段

1. JSON_EXTRACT(json_doc, path[, path]...) 或者使用->运算符,列名-> path

返回从json_doc中提取与path匹配的值,当参数为null或者无法从json_doc中匹配到值时返回null。如果json_doc不是一个标准的json串或者path不符合参数表达式规范时会报错。

->运算符,列名-> path

假设你有一个名为user的表,其中有一个名为user_data的json类型的字段,你可以使用以下查询来提取user_data中的特定值。

select user_data -> '$.name' as name from user;
或者
select json_extract(user_data, '$.name') as name from user;

二、生成JSON串

1. JSON_QUOTE(string)

通过使用双引号包裹字符串,转义内部的双引号及其他特殊字符(如换行符、反斜杠等),然后以utf8mb4编码格式返回处理后的结果。若参数为NULL则返回NULL。该函数主要用于生成符合规范的JSON字符串,以便将其安全地嵌入JSON文档中。

标准转义序列规范

转义序列描述
\"一个双引号字符
\b一个回格符
\f一个换页符
\n一个换行符
\r一个回车符
\ttab符
\\一个反斜杠
\uXXXUTF-8 bytes for Unicode value XXXX

三、修改JSON串

1. JSON_UNQUOTE(json_val)

该函数用于移除JSON值的引号(包括双引号"和转义引号"),并将结果转换为utf8mb4编码的字符串输出。若输入为NULL,则返回NULL。若输入非字符串类型(如数字、布尔值),则直接返回原始值。

如果需要更多详细信息,请查阅MySQL官方指导文档。dev.mysql.com/doc/refman/…