目录
- 字段定义和插入
- 创建一个带有json字段的表
- 插入记录
- 虚拟列和索引
- 添加json格式的数据列可以方便的查询
- 虚拟列和普通列之间不能互转,虚拟转普通和普通转虚拟都会报下面的错误
- 虚拟列数据来源不仅可以是json列,也可以引用普通字段
- 虚拟列修改
- 虚拟列索引
- 不创建虚拟列,也可以对json结构创建索引
- 数据的写入和修改
- 全量修改
- 部分修改
- json_insert
- json_replace
- json_set
- 数组修改
- json_array_append
- json_array_insert
- 数据合并
- json_merge
- json_merge_preserve
- json_merge_patch
- 删除数据
- json_remove
- 数据的查询和获取
- 数据提取函数
- cast()
- json_extract
- -->和-->>,可以用于json属性提取
- json_unquote和json_quote
- 查询相关函数
- json_contains_path
- json_contains
- json_overlaps
- member of
- 分组聚合
- json_arrayagg()
- json_objectagg()
- 其他信息获取
- json_keys
- json_search
- json_value
- json_depth
- json_length
- json_valid
- json_type
- 有关列长度和记录长度
- 相关文章json字效率和普通字段对比
字段定义和插入
创建一个带有json字段的表
插入记录
虚拟列和索引
添加json格式的数据列可以方便的查询
- 并且虚拟列多占用了一份空间
- 虚拟列的数据来自其他列,虚拟列不能直接修改,只能查询
- 如果要修改只能改原始的字段
- 可以对虚拟列建立索引,提升查询速度
虚拟列和普通列之间不能互转,虚拟转普通和普通转虚拟都会报下面的错误
虚拟列数据来源不仅可以是json列,也可以引用普通字段
虚拟列修改
只能修改原始列的数据,不能直接修改,这种修改的修改数据量几乎是全量的,修改数据量偏大,更新大量数据的时候容易undo日志缓存区溢出
虚拟列索引
虚拟列创建索引和普通字段创建索引一样,查询效果也几乎一样
备注:没有索引普通列查询速度比json列映射的虚拟列快
不创建虚拟列,也可以对json结构创建索引
语法: add index 索引名字( (cast( json表达式 as 数据类型 array)) );
数据类型可选:unsigned/signed/char(N)等
这个用的比较少,生效的场景比较少,不推荐,为啥呢,因为不容易看出哪些字段上有索引
注意:索引要索引命中必须在数据参数位置填入和索引定义一样的表达式,不能通过jsonPath修正,不然找不到
注意2:虽然没有定义虚拟列其实效果和定义虚拟列一样,需要考虑老数据数据类型转换是否兼容
注意3:
数据的写入和修改
全量修改
部分修改
json_insert
添加数据,不存在的才会插入,存在的忽略
格式: json_insert(json,path1,value1,path2,value2...)
json_replace
修改数据,已经存在替换,不存在的值忽略。
格式: json_insert(json,path1,value1,path2,value2...)
json_set
添加或者修改数据,存在的修改,不存在添加
格式: json_set(json,path1,value1,path2,value2...)
数组修改
json_array_append
向json数组追加数据,不是数组也能强行加一个元素然后变成数组,也可以不指定下标也能不指定下标
格式: json_array_append(json,path1,value1,path2,value2...)
json_array_insert
只能向普通数组插入,并且必须指定下标,比json_array_append约束多
数据合并
json_merge
合并的时候新旧值放到数组里面,支持一个值是数组一个值是子对象。
json_merge_preserve
和json_merge一样,mysql8.0.3以后建议使用这个json_merge_preserve
json_merge_patch
合并的时候用新的值覆盖旧的值,不一样的都会保留
格式: json_merge_patch(json,json2,json3)
删除数据
json_remove
删除元素
格式:json_remove(json_doc, path1,path2,...)
数据的查询和获取
很多json函数都是mysql8以后才支持的,使用select version();查询mysql版本
数据提取函数
cast()
cast 可以把json字符串装换成json对象
格式:cast( json对象 as 类型)
值 | 描述 |
DATE | 将value转换成'YYYY-MM-DD'格式 |
DATETIME | 将value转换成'YYYY-MM-DD HH:MM:SS'格式 |
TIME | 将value转换成'HH:MM:SS'格式 |
CHAR | 将value转换成CHAR(固定长度的字符串)格式 |
SIGNED | 将value转换成INT(有符号的整数)格式 |
UNSIGNED | 将value转换成INT(无符号的整数)格式 |
DECIMAL | 将value转换成FLOAT(浮点数)格式 |
BINARY | 将value转换成二进制格式 |
JSON | 将json格式 |
json_extract
提取json对象的属性,支持json字符串和json对象
格式:json_extract(json,path1,path2...)
-->和-->>,可以用于json属性提取
区别在-->不会去掉引号,-->>会去掉引号
需要注意箭头表达式不适合原始字符串json,只适合json对象
json_unquote和json_quote
区别在于是否保留引号json_unquote可以和别的json提取函数和箭头表达式配合使用
json_unquote可以接收json字符串或者是json对象
json_quote只能接受json字符串
查询相关函数
json_contains_path
判断路径是否存在
格式:json_contains_path(json_doc,"one/all", path1,path2 …)
json_contains
判断值是否存在,如果value是一个json,并且有多个值,那么是and的关系
格式:json_contains(json_doc,value,[path])
json_overlaps
比较两个json是否有重叠,只需要查询对象任意一个属性匹配就行,需要属性和值都相等,类似or
格式:json_overlaps(json,queryjson)
member of
判断元素是否存在,和类似 exists 和contans有什么区别?
格式:xxx member of(json)
分组聚合
json_arrayagg()
分组查询中,json_arrayagg可以把非分组字段聚合成数组
json_objectagg()
分组查询中,json_objectagg把非分组字段聚合成json对象
其他信息获取
json_keys
得到当前json的最外层所有key
格式:json_keys(json,[path])
json_search
通过值去查询path
格式:json_search(json,"all/one","搜索的值")
测算表test10如图
json_value
提取json 的值和 json_extract的区别?
格式:json_value(json,path,returntype,“路径是空的时候的默认值”,“路径错误的时候的默认值”)
json_depth
获取json的深度
json_length
json_length()得到元素个数
json_valid
判断json是否有效,貌似只要是有两层引号就会认为有效
json_type
得到类型
有关列长度和记录长度
varchar的长度限制16383,是256*256/4=16384,每添加一个字段需要占用一个字符,16383是在只有一个varchar字段的时候的极限,16383不仅是一个字段的极限也是表记录的极限。
text的上限是65535,并且text是存在行记录以外的,所以它可以突破16383的极限。