碉堡!Mysql8.0竟然可以直接操作json文档了
程序员的成长之路
互联网/程序员/技术/资料共享
关注
阅读本文大概需要 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文档了相关推荐
- 碉堡!Mysql8.0竟然可以直接操作json文档了。。。
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 经过漫长的测试, ...
- [Xcode 实际操作]七、文件与数据-(17)解析JSON文档
目录:[Swift]Xcode实际操作 本文将演示如何解析JSON文档. 项目中已添加一份JSON文档:menu.json 1 { 2 "menu": 3 { 4 "id ...
- itext操作pdf文档
关于itext操作pdf文档 pdf基本操作 自己点击链接去看下就会了 java使用itext生成pdf 再不行,去看官方文档 itext Api 直接找到com.itextpdf.text.pdf这 ...
- python操作word文档(python-docx)
python操作word文档(python-docx) 1. 效果图 1.1 python-docx文档标题段落(等级.加粗.斜体.居中)效果图 1.2 python-docx字体(加粗.斜体.居中. ...
- Collection+JSON 文档
Collection+JSON 文档 对于这个设计,我们不再以可能的状态和转移为起点,相反,我们将从一个集合状态响应中可能元素的顶层布局开始.从这一点入手,其他细节可以随着设计向超媒体类型最底层属性的 ...
- pythondocx模板_python操作docx文档(转)
关于python操作docx格式文档,我用到了两个python包,一个便是python-docx包,另一个便是python-docx-template;,同时我也用到了很出名的一个工具"pa ...
- 用python处理excel-使用Python操作Excel文档(一)
Python | 使用Python操作Excel文档(一) 0 前言 在阅读本文之前,请确保您已满足或可能满足以下条件: 请确保您具备基本的Python编程能力. 请确保您会使用Excel. 请确保您 ...
- ASP.NET操作Word文档(转)
ASP.NET操作Word文档(转) 操作WORD配置说明 引入:Word的对象库文件"MSWORD.OLB"(word 2000为MSWORD9.OLB) 1.运行Dcomcnf ...
- Python 操作Word文档插入图片和表格实例演示
Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...
最新文章
- windows命令_用Windows恢复环境(WinRE)排除电脑故障,只需一条命令
- 两个有序数组如何合并成一个有序数组
- 无边框对话框改变大小
- python翻译成计算机是啥_基于Python的业英语翻译器实现
- VTK:Shaders之MarbleShader
- 度量空间的应用_使用Dropwizard度量标准监视和测量无功应用
- LeetCode 1073. 负二进制数相加(负数进制)
- 43岁被裁员,200万年薪泡汤:这4件事你要尽早明白
- 一步一步SharePoint 2007之四十八:实现Excel Service(3)——调用Excel Service
- 北京理工大学语音识别技术.ppt
- 如何强制卸载edge_如何卸载微软Windows10自带的Edge浏览器?试试这个方法
- 软件著作权登记申请时的60页源代码格式
- C++转Java快速入门
- Avast! 4 Server 服务器版license许可文件获得方法
- MDI-jade化工软件的安装
- python爬虫基础教程115_python爬虫分析:115网盘的模拟登录
- 什么从什么写短句_什么从什么造句一年级如何造
- python读取nii文件、nii.gz文件
- UWB隧道人员定位技术-隧道定位监测系统-工地人员定位-新导智能
- oracle12设配置,Oracle 12C静默安装与配置