专栏首页SEian.G学习记录MySQL8.0 JSON函数之创建与返回JSON属性(四)

MySQL8.0 JSON函数之创建与返回JSON属性(四)

经过前面三篇的文章的介绍,相信大家已经对MySQL JSON数据类型有了一定的了解,为了在业务中更好的使用JSON类型,今天我们来具体介绍一下JSON函数的使用;

根据JSON函数的作用,我们将JSON函数划分为如下几个类别:

(1)创建JSON值的函数 (2)返回JSON值属性的函数 (3)搜索JSON值的函数 (4)修改JSON值的函数 (5)JSON表功能函数

本文我们将介绍创建和返回JSON值属性的相关函数的使用方法;

一、创建JSON值的函数

JSON_ARRAY([val[, val] …])

计算值列表(可能为空),并返回包含这些值的JSON数组。

mysql> SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());
+---------------------------------------------+
| JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME()) |
+---------------------------------------------+
| [1, "abc", null, true, "14:11:17.000000"]   |
+---------------------------------------------+
1 row in set (0.00 sec)

JSON_OBJECT([key, val[, key, val] …])

计算键值对的列表(可能为空),并返回包含这些键值对的JSON对象。如果任何键名为NULL或参数个数为奇数,则会发生错误。

mysql>SELECT JSON_OBJECT('id', 87, 'name', 'carrot');
+-----------------------------------------+
| JSON_OBJECT('id', 87, 'name', 'carrot') |
+-----------------------------------------+
| {"id": 87, "name": "carrot"}            |
+-----------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_OBJECT('id', 87, '', 'carrot');    
+-------------------------------------+
| JSON_OBJECT('id', 87, '', 'carrot') |
+-------------------------------------+
| {"": "carrot", "id": 87}            |
+-------------------------------------+
1 row in set (0.00 sec)
 
mysql >SELECT JSON_OBJECT('id', 87, 'carrot');    
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_OBJECT'
 
mysql>SELECT JSON_OBJECT('id', 87, null, 'carrot');  
ERROR 3158 (22032): JSON documents may not contain NULL member names.

JSON_QUOTE(string)

通过使用双引号字符和转义内部引号以及其他字符将字符串括起来作为JSON值引用,然后将结果作为utf8mb4字符串返回。如果参数为NULL,则返回NULL。

此函数通常用于生成有效的JSON字符串文字,以包含在JSON文档中。

mysql>SELECT JSON_QUOTE('[1, 2, 3]');
+-------------------------+
| JSON_QUOTE('[1, 2, 3]') |
+-------------------------+
| "[1, 2, 3]"             |
+-------------------------+
1 row in set (0.00 sec)

二、返回JSON值属性函数

JSON_DEPTH(json_doc)

返回 JSON 文档的最大深度。如果参数为 NULL,则 返回 NULL。如果参数不是有效的 JSON 文档,则会发生错误。

空数组、空对象或标量值的深度为1。仅包含深度为1的元素的非空数组或仅包含深度为1的成员值的非空对象的深度为2。否则,JSON文档的深度大于2。

mysql>SELECT JSON_DEPTH('{}'), JSON_DEPTH('[]'), JSON_DEPTH('true');
+------------------+------------------+--------------------+
| JSON_DEPTH('{}') | JSON_DEPTH('[]') | JSON_DEPTH('true') |
+------------------+------------------+--------------------+
|                1 |                1 |                  1 |
+------------------+------------------+--------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_DEPTH('[10, 20]'), JSON_DEPTH('[[], {}]');
+------------------------+------------------------+
| JSON_DEPTH('[10, 20]') | JSON_DEPTH('[[], {}]') |
+------------------------+------------------------+
|                      2 |                      2 |
+------------------------+------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT JSON_DEPTH('[10, {"a": 20}]');
+-------------------------------+
| JSON_DEPTH('[10, {"a": 20}]') |
+-------------------------------+
|                             3 |
+-------------------------------+
1 row in set (0.00 sec)

JSON_LENGTH(json_doc[, path])

返回 JSON 文档的长度,或者,如果path给出了参数,则返回 由路径标识的文档中值的长度。如果任何参数为NULL或路径参数未在文档中标识值,则返回NULL。如果json_doc参数不是有效的 JSON 文档或 path参数不是有效的路径表达式或包含通配符*或 **通配符,则会发生错误。

mysql> SELECT JSON_LENGTH('[1, 2, {"a": 3}]');
+---------------------------------+
| JSON_LENGTH('[1, 2, {"a": 3}]') |
+---------------------------------+
|                               3 |
+---------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}');
+-----------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}') |
+-----------------------------------------+
|                                       2 |
+-----------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b');
+------------------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b') |
+------------------------------------------------+
|                                              1 |
+------------------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.c');
+------------------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.c') |
+------------------------------------------------+
|                                           NULL |
+------------------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.d');
+------------------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.d') |
+------------------------------------------------+
|                                           NULL |
+------------------------------------------------+
1 row in set (0.00 sec)

文档的长度确定如下:

  • 标量的长度为 1。
  • 数组的长度是数组元素的数量。
  • 对象的长度是对象成员的数量。
  • 长度不计算嵌套数组或对象的长度。

JSON_TYPE(json_val)

返回utf8mb4指示JSON值类型的字符串。这可以是对象、数组或标量类型,如下所示:

mysql>SELECT JSON_TYPE(@j);
+---------------+
| JSON_TYPE(@j) |
+---------------+
| OBJECT        |
+---------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a'));
+------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a')) |
+------------------------------------+
| ARRAY                              |
+------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]'));
+---------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]')) |
+---------------------------------------+
| INTEGER                               |
+---------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]'));
+---------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]')) |
+---------------------------------------+
| BOOLEAN                               |
+---------------------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[2]'));
+---------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@j, '$.a[2]')) |
+---------------------------------------+
| NULL                                  |
+---------------------------------------+
1 row in set (0.00 sec)

如果参数为 NULL,JSON_TYPE()返回 NULL:

mysql>SELECT JSON_TYPE(NULL);
+-----------------+
| JSON_TYPE(NULL) |
+-----------------+
| NULL            |
+-----------------+
1 row in set (0.00 sec)

如果参数不是有效的 JSON 值,则会发生错误:

mysql dba_admin@127.0.0.1:(none)14:18:07> SELECT JSON_TYPE(1);
ERROR 3146 (22032): Invalid data type for JSON data in argument 1 to function json_type; a JSON string or JSON type is required.

对于非NULL、非错误结果,以下列表描述了可能的 JSON_TYPE()返回值:

* 纯JSON类型: *OBJECT: JSON 对象 *ARRAY: JSON 数组 *BOOLEAN:JSON 真假文字 *NULL:JSON 空字面量 *数字类型: *INTEGER: MySQL TINYINT, SMALLINT, MEDIUMINTand INT和 BIGINT标量 *DOUBLE: MySQL 标量 DOUBLE FLOAT *DECIMAL: MySQL DECIMAL和 NUMERIC标量 *时间类型: *DATETIME: MySQL DATETIME和 TIMESTAMP标量 *DATE: MySQL DATE标量 *TIME: MySQL TIME标量 *字符串类型: *STRING: MySQL utf8字符类型标量: CHAR, VARCHAR, TEXT, ENUM, and SET *二进制类型: *BLOB:MySQL二进制标量类型包括BINARY, VARBINARY, BLOB,和 BIT *所有其他类型: *OPAQUE (原始位)

JSON_VALID(val)

返回0或1以指示值是否为有效的JSON。如果参数为NULL,则返回NULL。

mysql>SELECT JSON_VALID('{"a": 1}');
+------------------------+
| JSON_VALID('{"a": 1}') |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_VALID('hello'), JSON_VALID('"hello"');
+---------------------+-----------------------+
| JSON_VALID('hello') | JSON_VALID('"hello"') |
+---------------------+-----------------------+
|                   0 |                     1 |
+---------------------+-----------------------+
1 row in set (0.00 sec)
 
mysql>SELECT JSON_VALID(NULL), JSON_VALID('"hello"');      
+------------------+-----------------------+
| JSON_VALID(NULL) | JSON_VALID('"hello"') |
+------------------+-----------------------+
|             NULL |                     1 |
+------------------+-----------------------+
1 row in set (0.00 sec)

好了,今天就先介绍到这里,关于JSON函数更多内容,后续会慢慢进行介绍;

关联阅读

MySQL 8.0 JSON增强到底有多强?(一)

MySQL如何给JSON列添加索引(二)

MySQL 8.0 新特性:多值索引 --如何给JSON数组添加索引(三)

本文分享自微信公众号 - DBA的辛酸事儿(dbabitter),作者:SEianG

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL 8.0 竟然可以直接操作json文档了。。。

    经过漫长的测试,即将整体迁移至Mysql8.0; Mysql8.0 对于Json操作新增/优化了很多相关Json的API操作; 阅读了一下官方文档,虽然绝大多数...

    用户1516716
  • MySQL8.0 JSON函数之搜索JSON值(五)

    之前的几篇文章介绍了JSON数据类型,相信大家已经对JSON有了一定的了解,上面一篇文章介绍了《MySQL8.0 JSON函数之创建与返回JSON属性(四)》J...

    SEian.G
  • MySQL 8.0.11 (2018-04-19, General Availability)

    仅支持通过使用 in-place 方式从 MySQL 5.7 升级到 MySQL 8.0 升级; 不支持从 MySQL 8.0 降级到 MySQL 5....

    MySQL轻松学
  • Ajax必须了解的(最全 通俗版)

    xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4)...

    CaesarChang张旭
  • Centos7安装MySQL8.0 - 操作手册

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能!

    洗尽了浮华
  • 第205天:面向对象知识点总结

    JSON全称为JavaScript对象简单表示法(JavaScript Object Notation)

    半指温柔乐
  • 解决浏览器跨域限制方案之JSONP

    JSONP即:JSON with Padding,是一种解决因浏览器跨域限制不允许访问跨域资源的方法。 JSONP是一个非官方的协议,它允许在服务器端返回...

    编程随笔
  • 前端学习(37)~js学习(十四):对象的创建

    第一次看到这种工厂模式时,你可能会觉得陌生。如果简化一下,可以写成下面这种形式,更容易理解:(也就是,利用new Object创建对象)

    Vincent-yuan
  • AJAX和JSON

    open方法不会向服务器发送真正请求,它相当于初始化请求并准备发送只能向同一个域中使用相同协议和端口的URL发送请求,否则会因为安全原因而报错。

    乐心湖
  • 腾讯云MySQL 8.0深度技术分析

    2020年7月8日,腾讯云正式发布了腾讯云MySQL 8.0。MySQL 8.0版本是一个里程碑式的版本,官方版本大幅度的提高了性能和可用性。而腾讯云基于官方版...

    用户1564362
  • 从零开始学 Web 之 ES6(二)ES5的一些扩展

    打印结果:Obj2下面的__proto__指向的原型对象中有Obj1的属性,相当于继承了Obj1属性。

    Daotin
  • 开发一定要看的Ajax编程

    Ajax编程入门 1.web交互的2种模式对比 ①:2种交互模式的流程 ? ②:2种交互模式用户体验 同步交互模式:客户端提交请求,等待,在响应回到客户端前,客...

    Java帮帮
  • 嗦一嗦 MySQL 8.0的新特性(一)

    导读 MySQL8.0 GA版本发布了,展现了众多新特性,本系列译文将整理为3篇,为大家介绍升级的部分新特性。 本文为第1篇,重点为大家介绍SQL、JSON上...

    wubx
  • JavaScript JSON解析与序列化

    JSON之所以流行是因为可以把JSON数据结构解析为有用的JavaScript对象。

    conanma
  • JavaScript 模式》读书笔记(3)— 字面量和构造函数3

      这是字面量和构造函数的最后一篇内容,其中包括了JSON、正则表达式字面量,基本值类型包装器等知识点。也是十分重要的哦。

    zaking
  • Jackson用法详解

    Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社区相对比较活跃,更新速度也比较快, 从 Git...

    三分恶
  • oracle mysql5.7 Json函数

    oracle mysql 5.7.8 之后增加了对json数据格式的函数处理,可更加灵活的在数据库中操作json数据,如可变属性、自定义表单等等都使用使用该方式...

    兜兜毛毛
  • ES10 都出了,还没弄明白 ES6?

    感谢支持ayqy个人订阅号,每周义务推送1篇(only unique one)原创精品博文,话题包括但不限于前端、Node、Android、数学...

    ayqy贾杰
  • Django之json、Ajax简介及实例介绍

    JSON 格式于2001年由 Douglas Crockford 提出,目的就是取代繁琐笨重的 XML 格式。

    菲宇

扫码关注云+社区

领取腾讯云代金券