在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,否则返回false | 8.0.17 |
| JSON_PRETTY() | 格式化JSON | |
| JSON_QUOTE() | quote JSON | |
| JSON_REMOVE() | 从JSON中删除数据 | |
| JSON_REPLACE() | 替换JSON串中的值 | |
| JSON_SCHEMA_VALID() | 校验JSON是否符合JSON SCHEMA的规范。符合返回true,否则返回false | 8.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 | 一个回车符 |
| \t | tab符 |
| \\ | 一个反斜杠 |
| \uXXX | UTF-8 bytes for Unicode value XXXX |
三、修改JSON串
1. JSON_UNQUOTE(json_val)
该函数用于移除JSON值的引号(包括双引号"和转义引号"),并将结果转换为utf8mb4编码的字符串输出。若输入为NULL,则返回NULL。若输入非字符串类型(如数字、布尔值),则直接返回原始值。
如果需要更多详细信息,请查阅MySQL官方指导文档。dev.mysql.com/doc/refman/…