作者:旺财别哭链接:https://www.jianshu.com/p/d4b...经过长时间的测试,整体迁移到Mysql8.0;Mysql8.0增加/优化Json操作看了很多Json相关的API操作;看了官方文档,虽然大部分JSON操作都是应用层完成的,但是我知道一些Mysql的JSON语法,方便调试;选择基本的和有价值的部分以备将来参考;https://dev.mysql.com/doc/ref...https://dev.mysql.com/doc/ref...简单概述不允许null;Json格式定义类似于LONGBLOB或LONGTEXT;它的最大长度由max_allowed_pa??cket控制;JSON_STORAGE_SIZE(xxx)查看函数时json字段占用的空间;除了普通的Json操作,还支持GeoJSON(基于几何的地理空间数据交换格式)和一些相关的操作;支持Json列的索引(结合Mysql8.0的新特性,函数索引);MySql8.0新增可选优化项,支持部分更新JsonColumn就地;可以使用的函数有JSON_SET(),JSON_REPLACE(),JSON_REMOVE();在使用的时候,有一些限制,但是会有更多的性能;JSON基础工具;//使用JSON_ARRAY方法定义JSON数组;SELECTJSON_ARRAY(1,"abc",NULL,TRUE,CURTIME())//Result:[1,"abc",null,true,"11:30:24.000000"]//JSON_OBJECT方法定义JSON对象SELECTJSON_OBJECT('id',87,'name','carrot')//Result{"id":87,"name":"carrot"}//数组和对象嵌套场景;[99,{"id":"HK500","cost":75.99},["hot","cold"]]{"k1":"value","k2":[10,20]}//日期/时间类型定义["12:18:29.000000","2015-07-29","2015-07-2912:18:29.000000"]//JSON_QUOTE将JSON对象转义为String,即转义内部符号,用双引号包起来;JSON_QUOTE('"null"')//Result"\"null\""//美化并输出JSON内容;JSON_PRETTY()//将JSON/JSON内部的元素转换为其他数据类型;//将JSONjdoc中的id元素转换为unsignedint如下;[https://dev.mysql.com/doc/refman/8.0/en/json.html#json-converting-between-types](https://dev.mysql.com/doc/refman/8.0/en/json.html#json-converting-between-types)ORDERBYCAST(JSON_EXTRACT(jdoc,'$.id')ASUNSIGNED);合并JSON的操作JSON_MERGE_PRESERVE()和JSON_MERGE_PATCH()在实际业务中很少用到;->-->operator,find根据key取值;不同的是-->会去掉“wrapped”和转义符号;其等价函数形式为JSON_EXTRACT()最新MySQL面试题整理推荐看这篇文章:http://www.javastack.cn/mst///{"mascot":"我们的吉祥物是一只名叫\"Sakila\"的海豚。"}mysql>SELECTcol->"$.mascot"FROMqtest;//Result:|“我们的吉祥物是一只名叫‘Sakila’的海豚。”|SELECTsentence->>"$.mascot"FROMfacts;//结果:|我们的吉祥物是一只名叫“Sakila”的海豚。|上面的JSONPath表达式-->双引号内的内容就是所谓的JSONPath表达式;语法是ECMA脚本规范,前端程序员应该特别熟悉;以下面的JSON为例;[3,{"a":[5,6],"b":10},[99,100]]$[0]=3;$[1]={"a":[5,6],"b":10};$[2]=[99,100];同时,$[1],$[2]不是标量,进一步$[1].a=[5,6]$[1].a[1]=6$[1].b=10;$[2][0]=99;进一步支持的语法功能$[ntom]$[1to2]=[{"a":[5,6],"b":10},[99,100]]$[last-2tolast-1]=[3,{"a":[5,6],"b":10}]总结;a.*代表object中的所有成员;b[*]代表数组中的所有单元格;c[prefix]**suffix表示所有以prefix开头,以suffix结尾的路径;查找并修改JSON//同上,应该换成-->语法;mysql>SELECTJSON_EXTRACT('{"a":1,"b":2,"c":[3,4,5]}','$.*');//[1,2,[3,4,5]]SELECTJSON_EXTRACT('{"a":1,"b":2,"c":[3,4,5]}','$.c[*]')//[3,4,5]SELECTJSON_EXTRACT('{"a":{"b":1},"c":{"b":2}}','$**.b');//[1,2]SELECTJSON_EXTRACT('[1,2,3,4,5]','$[1to3]');//[2,3,4]//JSON_SETJSON_INSERTJSON_REPLACEJSON_REMOVESET@j='["a",{"b":[true,false]},[10,20]]';SELECTJSON_SET(@j,'$[1].b[0]',1,'$[2][2]',2);//|[“a”,{“b”:[1,假]},[10,20,2]]SELECTJSON_INSERT(@j,'$[1].b[0]',1,'$[2][2]',2);//["a",{"b":[真,假]},[10,20,2]]JSON_REPLACE(@j,'$[1].b[0]',1,'$[2][2]',2)//["a",{"b":[1,false]},[10,20]]SELECTJSON_REMOVE(@j,'$[2]','$[1].b[1]','$[1.b[1]');//["a",{"b":[true]}]JSON表函数常见的场景是JSON数据本身就是一个表结构;JSON_TABLE(*expr*,*path*COLUMNS(*column_list*)[AS\]*alias*)SELECT*FROMJSON_TABLE('[{"a":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]',->"$[*]"->COLUMNS(->rowidFORORDINALITY,->acVARCHAR(100)PATH"$.a"DEFAULT'111'ONEMPTYDEFAULT'999'ONERROR,->ajJSONPATH"$.a"DEFAULT'{"x":333}'ONEMPTY,->bxINTEXISTSPATH"$.b"->)->)AStt;JSON值的比较和排序目前没有值;AggregationofJSONValues目前没有值;可以通过将返回值转换为其他类型来使用聚合函数;近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别再满脑子if/else了,试试策略模式,真香!!3.操!Java中xx≠null的新语法是什么?4.春天ngBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!
