经过长期测试,将整体迁移到Mysql8.0;Mysql8.0为Json操作增加/优化了很多Json相关的API操作。看了官方文档,虽然大部分JSON操作都是在应用层完成的,但是知道一些MysqlJSON语法,方便调试;选出基本的、有价值的部分,以供日后参考。https://dev.mysql.com/doc/refman/8.0/en/json.htmlhttps://dev.mysql.com/doc/refman/8.0/en/json-utility-functions.html不允许简单概述它是空的;Json格式定义类似于LONGBLOB或LONGTEXT;它的最大长度由max_allowed_pa??cket控制;JSON_STORAGE_SIZE(xxx)查看函数时json字段占用的空间;除了普通的Json操作外,还支持GeoJSON(基于geometry的图形化地理空间数据交换格式)及一些相关操作;支持Json列的索引(结合Mysql8.0的新特性,函数索引);MySql8增加了一个可选的优化项,可以支持part和updateJsonColumn就地。0;可以使用的函数有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')未签名);合并JSON的操作,JSON_MERGE_PRESERVE()和JSON_MERGE_PATCH(),在实际业务中用的比较少;->-->operator,根据key找到value;区别在于-->会去掉包裹的"和转义符号;它的等效函数形式为JSON_EXTRACT()//{"mascot":"Ourmascotisadolphinnamed\"Sakila\"."}mysql>SELECTcol->"$.mascot"FROMqtest;//Result:|"Ourmascotisadolphinnamed\"Sakila\""."|SELECTsentence->>"$.mascot"FROMfacts;//Result:|Ourmascotisadolphinnamed"Sakila".|JSON路径表达式上面-->双引号内的内容就是所谓的JSONPath表达式;语法是ECMAScript规范的一部分,所以前端程序员应该特别熟悉。以下面的JSON为例:[3,{"a":[5,6],"b":10},[99,100]]$[0]=3;$[1]={"a":[5,6],"b":10};$[2]=[99,100];同时,[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。代表对象中的所有成员;b[]代表数组中的所有单元格;c[prefix]**suffixis代表所有以prefix开头,以suffix结尾的路径;另外,MySQL系列面试题和答案都整理好了,微信搜索互联网架构师,后台发送:2T,可以在线阅读。查找并修改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,false]},[10,20,2]]SELECTJSON_INSERT(@j,'$[1].b[0]',1,'$[2][2]',2);//["a",{"b":[true,false]},[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(->rowidFOORDINALITY,->acVARCHAR(100)PATH"$.a"DEFAULT'111'ONEMPTYDEFAULT'999'ONERROR,->ajJSONPATH"$.a"DEFAULT'{"x":333}'ONEMPTY,->bxINTEXISTSPATH"$.b"->)->)ASTt;JSON值的比较和排序目前还没有倒排值的感觉;AggregationofJSONValues目前感觉不到倒排值;您可以通过将返回值转换为另一种类型来使用聚合函数。
