使用MySQL 8.0 操作 JSON 实践

经过漫长的测试,即将整体迁移至Mysql8.0; Mysql8.0 对于Json操作新增/优化了很多相关Json的API操作。
阅读了一下官方文档,虽然绝大多数的JSON操作都是应用层完成,但是会一些Mysql的JSON语法,方便进行debug;选出基础的, 有价值的部分,供未来参考;
https://dev.mysql.com/doc/refman/8.0/en/json.html https://dev.mysql.com/doc/refman/8.0/en/json-utility-functions.html
简单概述
不允许为null; Json格式定义与LONGBLOB or LONGTEXT类似;它的最大长度是受到max_allowed_packet所控制的;
查看JSON字段所占用空间大小的函数时JSON_STORAGE_SIZE(xxx);
除普通的Json操作,额外支持GeoJSON (基于几何图形的针对地理空间数据交换格式)一些相关操作;
对Json栏位支持索引(结合Mysql8.0新特性,函数index);
一个可以支持部分的,原地更新Json Column 的可选优化项加入MySql8.0; 可以使用的函数有JSON_SET(), JSON_REPLACE() ,JSON_REMOVE(); 使用时,有一些约束,但是会有更加的性能;
合并JSON的操作 JSON_MERGE_PRESERVE() and JSON_MERGE_PATCH() 实际业务用的可能性很少;
-> -->操作符,按照key 找值;区别在于 -->会去除包裹的”以及转义符号; 它的等价的Function形式是JSON_EXTRACT()
// {'mascot': 'Our mascot is a dolphin named \'Sakila\'.'}mysql> SELECT col->'$.mascot' FROM qtest;//结果:| 'Our mascot is a dolphin named \'Sakila\'.' |SELECT sentence->>'$.mascot' FROM facts;// 结果: | Our mascot is a dolphin named 'Sakila'. |
JSON Path expression上面 --> 后双引号中的内容就是所谓的JSON Path expression; 该语法是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;
更进一步支持的语法特性$[n to m]
$[ 1 to 2] = [{'a': [5, 6], 'b': 10}, [99, 100]]
$[last-2 to last-1] = [3, {'a': [5, 6], 'b': 10}]
//如上, 应该可以用-->语法取代;mysql> SELECT JSON_EXTRACT('{'a': 1, 'b': 2, 'c': [3, 4, 5]}', '$.*');//[1, 2, [3, 4, 5]] SELECT JSON_EXTRACT('{'a': 1, 'b': 2, 'c': [3, 4, 5]}', '$.c[*]')//[3, 4, 5]SELECT JSON_EXTRACT('{'a': {'b': 1}, 'c': {'b': 2}}', '$**.b');//[1, 2]SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]');//[2, 3, 4]//JSON_SET JSON_INSERT JSON_REPLACE JSON_REMOVESET @j = '['a', {'b': [true, false]}, [10, 20]]';SELECT JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2);//| ['a', {'b': [1, false]}, [10, 20, 2]] SELECT JSON_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]]SELECT JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]');//['a', {'b': [true]}]
JSON Table Functions 一个比较常见的场景是JSON数据本身是一个表的结构;JSON_TABLE(*expr*, *path* COLUMNS (*column_list*) [AS\] *alias*)
SELECT * FROM JSON_TABLE( '[{'a':'3'},{'a':2},{'b':1},{'a':0},{'a':[1,2]}]',
-> '$[*]'
-> COLUMNS(
-> rowid FOR ORDINALITY,
-> ac VARCHAR(100) PATH '$.a' DEFAULT '111' ON EMPTY DEFAULT '999' ON ERROR,
-> aj JSON PATH '$.a' DEFAULT '{'x': 333}' ON EMPTY,
-> bx INT EXISTS PATH '$.b'
-> )
-> ) AS tt;
Comparison and Ordering of JSON Values目前没感觉倒价值; Aggregation of JSON Values目前没感觉倒价值; 将返回值转成其他类型就可以使用聚合函数;
作者:旺财不哭
链接:https://www.jianshu.com/p/d4b012769a3b
(版权归原作者所有,侵删)

