尝鲜!Mysql8.0竟然可以直接操作json文档了

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:   经过漫长的测试,即将整体迁移至Mysql8.0; Mysql8.0 对于Json操作新增/优化了很多相关Json的API操作; 阅读了一下官方文档,虽然绝大多数的JSON操作都是应用层完成,但是会一些Mysql的JSON语法,方便进行debug;选出基础的, 有价值的部分,供未来参考。  # 简单概述  不允许为null; Json格式定义与LONGBLOB or LONGTEXT类似;它的最大长度是受到max_allowed_packet所控制的;查看JSON字段所占用空间大小的函数时JSON_STORAGE_SIZE(xxx);除普通的Json操作,额外支持GeoJSON (

  经过漫长的测试,即将整体迁移至Mysql8.0; Mysql8.0 对于Json操作新增/优化了很多相关Json的API操作; 阅读了一下官方文档,虽然绝大多数的JSON操作都是应用层完成,但是会一些Mysql的JSON语法,方便进行debug;选出基础的, 有价值的部分,供未来参考。

  # 简单概述

  不允许为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", "2021-07-29", "2021-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=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_REMOVE

  SET @j='["a", {"b": [true, false]}, [10, 20]]';

  SELECT JSON_SET(@j, '$[1].b[0]', 1, '$2', 2);

  //| ["a", {"b": [1, false]}, [10, 20, 2]]

  SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$2', 2);

  //["a", {"b": [true, false]}, [10, 20, 2]]

  JSON_REPLACE(@j, '$[1].b[0]', 1, '$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

  目前没感觉倒价值; 将返回值转成其他类型就可以使用聚合函数;

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
JSON 关系型数据库 MySQL
MySQL JSON数据存储结构与操作
通过本文的介绍,我们了解了MySQL中JSON数据类型的基本操作、常用JSON函数、以及如何通过索引和优化来提高查询性能。JSON数据类型为存储和操作结构化数据提供了灵活性和便利性,在现代数据库应用中具有广泛的应用前景。希望本文对您在MySQL中使用JSON数据类型有所帮助。
26 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL中的 where 1=1会不会影响性能?看完官方文档就悟了!
本文探讨了在Mybatis中使用`where 1=1`进行动态SQL拼接是否会影响性能。通过MySQL官方资料和实际测试表明,`where 1=1`在MySQL 5.7及以上版本中会被优化器优化,因此对性能影响不大。文中详细对比了`where 1=1`与`<where>`标签的使用方法,并建议根据MySQL版本和团队需求选择合适的方式。最后,推荐查找官方资料以确保技术路线正确。
35 4
|
5月前
|
存储 安全 Java
基于Java+MySQL停车场车位管理系统详细设计和实现(源码+LW+调试文档+讲解等)
基于Java+MySQL停车场车位管理系统详细设计和实现(源码+LW+调试文档+讲解等)
|
2月前
|
关系型数据库 MySQL
mysql 官网文档
mysql官网使用指南
mysql 官网文档
|
3月前
|
存储 JSON 关系型数据库
MySQL与JSON的邂逅:开启大数据分析新纪元
MySQL与JSON的邂逅:开启大数据分析新纪元
|
5月前
|
JSON 关系型数据库 MySQL
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
149 1
|
5月前
|
JSON 关系型数据库 MySQL
理解和利用MySQL中的JSON功能
理解和利用MySQL中的JSON功能
186 2
|
5月前
|
JSON 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在使用CDAS语法同步MySQL数据到Hologres时,如果开启了字段类型宽容模式,MySQL中的JSON类型会被转换为什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
存储 JSON 关系型数据库
MySQL JSON 类型:功能与应用
MySQL JSON 类型:功能与应用
|
5月前
|
JSON 资源调度 Kubernetes
实时计算 Flink版操作报错合集之解析JSON数组时,遇到报错,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
下一篇
无影云桌面