经过漫长的测试,即将整体迁移至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的操作 -> -->操作符,按照key 找值;区别在于 -->会去除包裹的”以及转义符号; 它的等价的Function形式是JSON_EXTRACT() JSON Path expression上面 --> 后双引号中的内容就是所谓的JSON Path expression; 该语法是ECMAScript规范的一部分,所以前端程序员应该特别熟悉。 以下面这段JSON为例; 与此同时,[2] 并非标量, 进一步 更进一步支持的语法特性$[n to m] JSON Table Functions 一个比较常见的场景是JSON数据本身是一个表的结构;JSON_MERGE_PRESERVE()
and JSON_MERGE_PATCH()
实际业务用的可能性很少;// {'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'. | [3, {'a': [5, 6], 'b': 10}, [99, 100]]
$[0] = 3 ;
$[1] = {'a': [5, 6], 'b': 10};
$[2] = [99, 100];$[1].a = [5,6]
$[1].a[1] = 6
$[1].b = 10;
$[2][0] = 99; $[ 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(*
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;
作者:旺财不哭
链接:https://www.jianshu.com/p/d4b012769a3b
(版权归原作者所有,侵删)
联系客服