程序员的成长之路

互联网/程序员/技术/资料共享

关注

阅读本文大概需要 4.5 分钟。

作者:旺财不哭
来源:https://www.jianshu.com/p/d4b012769a3b

经过漫长的测试,即将整体迁移至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];
与此同时,$[1], $[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为结束的所有路径;

  • 查找并修改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
    目前没感觉倒价值; 将返回值转成其他类型就可以使用聚合函数;

<END>

推荐阅读:

21 款 yyds 的 IDEA插件

消息幂等(去重)通用解决方案,写得真好!

互联网初中高级大厂面试题(9个G)

内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级......等技术栈!

⬇戳阅读原文领取!                                       朕已阅 

碉堡!Mysql8.0竟然可以直接操作json文档了相关推荐

  1. 碉堡!Mysql8.0竟然可以直接操作json文档了。。。

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 经过漫长的测试, ...

  2. [Xcode 实际操作]七、文件与数据-(17)解析JSON文档

    目录:[Swift]Xcode实际操作 本文将演示如何解析JSON文档. 项目中已添加一份JSON文档:menu.json 1 { 2 "menu": 3 { 4 "id ...

  3. itext操作pdf文档

    关于itext操作pdf文档 pdf基本操作 自己点击链接去看下就会了 java使用itext生成pdf 再不行,去看官方文档 itext Api 直接找到com.itextpdf.text.pdf这 ...

  4. python操作word文档(python-docx)

    python操作word文档(python-docx) 1. 效果图 1.1 python-docx文档标题段落(等级.加粗.斜体.居中)效果图 1.2 python-docx字体(加粗.斜体.居中. ...

  5. Collection+JSON 文档

    Collection+JSON 文档 对于这个设计,我们不再以可能的状态和转移为起点,相反,我们将从一个集合状态响应中可能元素的顶层布局开始.从这一点入手,其他细节可以随着设计向超媒体类型最底层属性的 ...

  6. pythondocx模板_python操作docx文档(转)

    关于python操作docx格式文档,我用到了两个python包,一个便是python-docx包,另一个便是python-docx-template;,同时我也用到了很出名的一个工具"pa ...

  7. 用python处理excel-使用Python操作Excel文档(一)

    Python | 使用Python操作Excel文档(一) 0 前言 在阅读本文之前,请确保您已满足或可能满足以下条件: 请确保您具备基本的Python编程能力. 请确保您会使用Excel. 请确保您 ...

  8. ASP.NET操作Word文档(转)

    ASP.NET操作Word文档(转) 操作WORD配置说明 引入:Word的对象库文件"MSWORD.OLB"(word 2000为MSWORD9.OLB) 1.运行Dcomcnf ...

  9. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

最新文章

  1. windows命令_用Windows恢复环境(WinRE)排除电脑故障,只需一条命令
  2. 两个有序数组如何合并成一个有序数组
  3. 无边框对话框改变大小
  4. python翻译成计算机是啥_基于Python的业英语翻译器实现
  5. VTK:Shaders之MarbleShader
  6. 度量空间的应用_使用Dropwizard度量标准监视和测量无功应用
  7. LeetCode 1073. 负二进制数相加(负数进制)
  8. 43岁被裁员,200万年薪泡汤:这4件事你要尽早明白
  9. 一步一步SharePoint 2007之四十八:实现Excel Service(3)——调用Excel Service
  10. 北京理工大学语音识别技术.ppt
  11. 如何强制卸载edge_如何卸载微软Windows10自带的Edge浏览器?试试这个方法
  12. 软件著作权登记申请时的60页源代码格式
  13. C++转Java快速入门
  14. Avast! 4 Server 服务器版license许可文件获得方法
  15. MDI-jade化工软件的安装
  16. python爬虫基础教程115_python爬虫分析:115网盘的模拟登录
  17. 什么从什么写短句_什么从什么造句一年级如何造
  18. python读取nii文件、nii.gz文件
  19. UWB隧道人员定位技术-隧道定位监测系统-工地人员定位-新导智能
  20. oracle12设配置,Oracle 12C静默安装与配置

热门文章

  1. jquery循环获取元素
  2. 2011-2021年北京大学数字普惠金融指数(全国省、地级市、县域均有)
  3. 小试牛刀--我的快速离散傅里叶变化matlab函数(FFT)
  4. 【交互设计】弹窗、新页面、当前页跳转
  5. 【仓储管理系统需求分析(二)】
  6. 太空人时间HTML,基于JavaScript实现网红太空人表盘的完整代码
  7. 点击下载 Android版 APP,AI录屏自动点击器
  8. python实现KMP算法
  9. 利用Python对NBA SportUV数据进行可视化及分析
  10. easypoi数据校验