MySQL 8.0 可以操作 JSON 了

目录
  • 1、简单概述
  • 2、JSON基础工具
  • 3、JSON Path expression
  • 4、查找并修改JSON

前言:

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

https://dev.mysql.com/doc/ref...
https://dev.mysql.com/doc/ref...

1、简单概述

不允许为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() ; 使用时,有一些约束,但是会有更加的性能;

2、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". |

3、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为结束的所有路径;

4、查找并修改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]', 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

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

到此这篇关于MySQL 8.0 可以操作 JSON 了的文章就介绍到这了,更多相关MySQL 8.0 操作 JSON内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL提取Json内部字段转储为数字

    目录 背景 问题分析 1.属性值是 Json 格式的,需要使用 Json 操作函数处理 2.字段内容不规范,乱七八糟 3.又要抽取内容.又要格式化,记录还有 900w+,太慢了 最后执行结果比较 数据导入比较 总结 这只是一次简单数据迁移的统计,数据量不大,麻烦的是一些中间步骤处理和思量. 没有 SQL 优化.索引优化的内容,大家轻喷. 背景 用户眼科属性表记录数大概 986w,目的是把大概 29w 记录的属性值(json 格式)的其中八个字段解析为数字,转储为统计表的记录,用于图表分析. 以下

  • mysql json格式数据查询操作

    预设表名是 base_data , json列名是 json_value json_value的值是 {"ids":["a","b"],"datas":[{"name":"张三"}]} 那么查询语句应该是 select * from base_data where JSON_CONTAINS(json_value -> "$.ids", JSON_ARRAY('

  • MySQL中查询json格式的字段实例详解

    工作开发过程遇到一个需求:需要动态存储客户的姓名.手机号码.身份证.证件类型,意思是可能前端会传一个人或二个人或者三个人的信息是动态的不固定人数的四个字段(姓名.手机号码.身份证.证件类型). 前端页面如下: 我是使用List来接收前端传过来 json,mysql 用 varchar 来保存这个 json 数组 [{ "cardId": "110101199003072316", "cstName": "张双儿1", &quo

  • mybatis plus实体类中字段映射mysql中的json格式方式

    目录 mybatis plus实体类中字段映射mysql中的json格式 1.实体类中有个属性是其他对象 2.那么取出时怎么进行映射呢,有分为两种情况 mybatis-plus 实体 json 处理 本文总共三个步骤 mybatis plus实体类中字段映射mysql中的json格式 1.实体类中有个属性是其他对象 或者是List:在数据库中存储时使用的是mysql的json格式,此时可以用mybatis plus的一个注解 @TableField(typeHandler = JacksonTy

  • MySQL处理JSON常见函数的使用

    官方文档:JSON Functions Name Description JSON_APPEND() Append data to JSON document JSON_ARRAY() Create JSON array JSON_ARRAY_APPEND() Append data to JSON document JSON_ARRAY_INSERT() Insert into JSON array -> Return value from JSON column after evaluati

  • Mysql将查询结果集转换为JSON数据的实例代码

    Mysql将查询结果集转换为JSON数据 前言学生表学生成绩表查询单个学生各科成绩(转换为对象JSON串并用逗号拼接)将单个学生各科成绩转换为数组JSON串将数组串作为value并设置key两张表联合查询(最终SQL,每个学生各科成绩)最终结果 前言 我们经常会有这样一种需求,一对关联关系表,一对多的关系,使用一条sql语句查询两张表的所有记录,例:一张学生表,一张学生各科成绩表,我们想要用一条SQL查询出每个学生各科成绩: 学生表 CREATE TABLE IF NOT EXISTS `stu

  • MySQL 8.0 可以操作 JSON 了

    目录 1.简单概述 2.JSON基础工具 3.JSON Path expression 4.查找并修改JSON 前言: 经过漫长的测试,即将整体迁移至Mysql8.0; Mysql8.0 对于Json操作新增/优化了很多相关Json的API操作; 阅读了一下官方文档,虽然绝大多数的JSON操作都是应用层完成,但是会一些Mysql的JSON语法,方便进行debug:选出基础的, 有价值的部分,供未来参考: https://dev.mysql.com/doc/ref... https://dev.m

  • MySQL数据库基础学习之JSON函数各类操作详解

    目录 前言 一.JSON语法规则 二.JSON函数 1.JSON_CONTAINS(json_doc,value)函数 2.JSON_SEARCH()函数 3.JSON_PRETTY(json_doc)函数 4.JSON_DEPTH(json_doc)函数 5.JSON_LENGTH(json_doc[,path])函数 6.JSON_KEYS(json_doc[,path])函数 7. JSON_INSERT(json_doc,path,val[,path,val] ...)函数 8.JSON

  • MySQL 8.0.0开发里程碑版发布!

    MySQL 开发团队于 12 日宣布 MySQL 8.0.0 开发里程碑版本(DMR)发布! 可能有人会惊奇 MySQL 为何从 5.x 一下跳跃到了 8.0.事实上,MySQL 5.x 系列已经延续了很多年,从被 Oracle 收购之前就是 5.1,而收购之后一直维持在 5.x,比如 5.5,5.6,5.7 等等.其实,如果按照原本的发布节奏,可以把 5.6.x 当成 6.x,5.7.x 当成 7.x.所以,只是换了版本命名方式而已. 不过这次发布的 MySQL 8.0.0 开发版本还是有不少

  • MySql 8.0.11安装配置教程

    官网地址:https://dev.mysql.com/downloads/mysql/ 我这里是RHEL6.5的系统,因此选择RedHat 6 x86,64bit操作系统---下载第一个RPM Bundle即可--mysql-8.0.11-1.el6.x86_64.rpm-bundle.tar. 目前MySQL8.0.11社区版提供了多种多样的安装方式,但是并未发现针对Linux Generic安装包包含的mysql_secure_installation的安装说明. 因此这里使用推荐的RPM安

  • MySQL 8.0用户和角色管理原理与用法详解

    本文实例讲述了MySQL 8.0用户和角色管理.分享给大家供大家参考,具体如下: MySQL8.0新加了很多功能,其中在用户管理中增加了角色的管理, 默认的密码加密方式也做了调整,由之前的sha1改为了sha2,同时加上5.7的禁用用户和用户过期的设置, 这样方面用户的管理和权限的管理,也增加了用户的安全性. MySQL8.0中,MySQL库中表的文件合并到数据根目录中的mysql.ibd中(MySQL8.0 Innodb引擎重构). 同时MySQL8.0可以使用SET PERSIST动态修改参

  • Mysql使用函数json_extract处理Json类型数据的方法实例

    目录 1. 需求概述 2. json_extract简介 2.1 函数简介 2.2 使用方式 2.3 注意事项 3. 实现验证 3.1 建表查询 3.2 查询结果 总结 1. 需求概述 业务开发中通常mysql数据库中某个字段会需要存储json格式字符串,查询的时候有时json数据较大,每次全部取出再去解析查询效率较低,也比较麻烦,则Mysql5.7版本提供提供函数json_extract,可以通过key查询value值,比较方便. 2. json_extract简介 2.1 函数简介 Mysq

  • mysql 8.0 安装配置方法教程

    一.安装mysql yum源 从官网http://dev.mysql.com/downloads/repo/yum/下载mysql最新的yum源的rpm安装包 wget http://repo.mysql.com//mysql57-community-release-el6-9.noarch.rpm 使用yum安装rpm包 yum install mysql57-community-release-el6-9.noarch.rpm 检测mysql yum源 yum repolist enable

  • c#操作json示例分享

    1..NET对JSON的支持介绍 (1)操作Json的DLL介绍 .NET自身有System.Runtime.Serialization.dll与System.Web.Extensions.dll,使用这两个DLL可以把对象序列化和反序列化成Json数据.也可以使用第三方的Newtonsoft.Json.dll来操作Json数据,使用它会更方便的操作Json数据,其功能也跟强一些. (2)使用System.Web.Extensions.dll的限制 要使用System.Web.Extension

  • 利用tcpdump对mysql进行抓包操作技巧

    利用tcpdump对mysql进行抓包操作如下所示: 命令如下: 复制代码 代码如下: tcpdump -s 0 -l -w - dst 192.168.244.10 and port 3306 -i eno16777736 |strings 其中-i指定监听的网络接口,在RHEL 7下,网络接口名不再是之前的eth0,而是 eno16777736. 在RHEL 5&6下,可直接不带-i参数,因为它默认是eth0.在RHEL 7下,如果不用-i参数指定网络接口,则会报如下错误: 复制代码 代码如

  • MySQL 5.0.16乱码问题的解决方法

    怎样解决MySQL 5 0 16的乱码问题? 本文给出了解决方法: 问:怎样解决MySQL 5.0.16的乱码问题? 答:MySQL 5.0.16的乱码问题可以用下面的方法解决: 1.设置phpMyAdmin Language:Chinese simplified (zh-utf-8) MySQL 字符集:UTF-8 Unicode (utf8) MySQL 连接校对 gbk_chinese_ci 2.创建数据库时 整理设置成 gbk_chinese_ci 3.用SQL建立表中 ENGINE=M

随机推荐