使用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_ARRAY方法定义JSON数组;SELECT JSON_ARRAY(1, 'abc', NULL, TRUE, CURTIME())//结果:[1, 'abc', null, true, '11:30:24.000000']  //JSON_OBJECT 方法定义JSON对象SELECT JSON_OBJECT('id', 87, 'name', 'carrot')//结果{'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-29 12:18:29.000000'] //JSON_QUOTE 将JSON对象转义成String, 就是将内部的符  号进行转义,并整体包裹上双引号;JSON_QUOTE(' 'null' ')//结果 '\'null\''//将JSON内容美化并输出;JSON_PRETTY()//可以将JSON/JSON内部的元素转化为其他数据类型;//如下将JSON jdoc 中的id元素,转化为 unsigned int;[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)ORDER BY CAST(JSON_EXTRACT(jdoc, '$.id') AS   UNSIGNED);

合并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}]
总结一下;
a .是代表所有的members in object; b []是代表所有的cells in array; c [prefix] ** suffix 是代表以prefix开始,以suffix为结束的所有路径;另外,MySQL 系列面试题和答案全部整理好了,微信搜索互联网架构师,在后台发送:2T,可以在线阅读。

查找并修改JSON

//如上, 应该可以用-->语法取代;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

文章转载:21CTO

(版权归原作者所有,侵删)

(0)

相关推荐

  • 常用的转义字符

    \      使反斜杠后面的一个变量变为单纯的字符串 "      如果想要将处理的结果全局转义,加单引号 "" 如果要处理的对象中有空格的话,需要加双引号将其作为一个整 ...

  • 正则表达式在MySQL5.7和MySQL8.0中的用法以及区别(一)

    各位客官姥爷好,欢迎回来.我们上节给出了MySQL数据库的安装教程,我们上节给的是5.7版本的安装教程,鉴于有部分企业已经使用8.0版本的MySQL,那么下面我将对比着学习正则表达式在这两个版本中的差 ...

  •  Mysql 候选项路径/etc/mysql/mysql.cnf不存在

    ubuntu系统:今天打开电脑登陆mysql:mysql -uroot -p 结果发现了这个错误 Can't connect to local MySQL server through socket ...

  • MySQL 8.0中的JSON增强

    现在很多应用环境中都能看到JSON灵活的影子.各阶段数据层次的递归层次,能很好的分辨.一直对MySQL的JSON很期待的,最近才有时间研究一下. JSON了解 JSON就是一串字符串,只不过元素会使用 ...

  • 欧美股市的基本面情况和a股庄家T+1规则下的T+0操作手法介绍 ----港欧美股和A股的对比和入门常识的专题篇

    各位听众朋友们大家好,今天我们来说一说欧美股市的基本面情况和在a股T+1规则机构游资是用怎么样的操作手法来玩散户的. 本文来自微信公众号:爱投资的小熊猫.有兴趣的朋友也可以同时打开微信,边听边看,更加 ...

  • 如何利用T+0操作获利?本文详细解析

    如何利用T+0操作获利? 一."T+0"操作必须建立在对个股的长期观察和多次模拟操作的基础上,能够非常熟悉个股股性和市场规律. 二."T+0"操作要求投资者必须 ...

  • 短线天才总结T+0操作神技 拯救千万亏钱散户

    弱势行情,做股票被套那是大概率的事情,在买入股票被套后,对于追涨型的,当然只有止损,但是对于抄底型的,止损割肉也不是很明智,但是几天看着手中票起起落落,盯盘也是挺浪费时间也很无聊的事情,这时可以选一些 ...

  • 拯救无数被套散户的T+0操作技巧 错过就亏大了

    股市本是一个嘈嘈杂杂的世界的缩影,有人欢喜,有人忧.为何很多散户屡战不胜,追涨杀跌,陷入无限的恶性循环中,最终心灰意冷,拂袖而去.笔者认为,就是因为这些人没有自己的一种严格的操盘知识策略,没有给你自己 ...

  • 短线王必备的3种T+0操作技巧,解套不用愁

    股市中被套的股民永远都占大多数,所以解套是在股市永恒的话题.股票被套后肯定会想法解套,但解套方法那么多,到底用哪一种好呢?死扛解套?直接卖 出解套?还是其他的解套方法?这要取决于个人的操作习惯以及行情 ...

  • T 0操作技巧

    一.日线T+0: 大盘和个股的节奏预期要不断加强,好比走路或者下围棋,走一步看三步,尤其对手中个股处于什么阶段(起涨.盘升.主升.盘跌.杀跌等)要心中有数,也就是先看日线趋势,日线趋势才能决定分时趋势 ...

  • 一位资深老股民赠言:学会分时图T 0操作技巧,每次都轻松赚钱

    在A股混,你给自己的定位,到底是投资,还是投机. 什么叫投资?就好比把投资的股票当女儿,你给自己女儿钱,还要赚差价吗?你把她当成女儿对待,好好培养,她自然不亏待你,这就叫价值投资,靠时间获取时间. 那 ...

  • 终于有人把T 0操作技巧说透彻了,高抛低吸并不难

    无论短线.中线,经常做T,远比持股不动要好很多很多;尤其在大盘震荡.下跌期间,盘中做T+0,是一种非常稳健.高效的套利手段:道理很简单,开 新仓,能否盈利,还得明天说了算,而T是当日完成,多了确定性, ...