首页 > 数据库 >【MySQL】MySQL 8 的 JSON 新特性详解(1)JSON 数据类型

【MySQL】MySQL 8 的 JSON 新特性详解(1)JSON 数据类型

时间:2023-02-03 19:34:22浏览次数:66  
标签:city MySQL 数据类型 JSON address Docker data

一、概述

你好,我是小雨青年,一名使用MySQL 8 的程序员。

MySQL 8 引入了对 JSON 数据类型的全面支持,并提供了一组内置函数以有效处理 JSON 数据。MySQL 8 中的 JSON 支持的一些关键特性如下:

  1. JSON 数据类型:MySQL 8 拥有一个名为 JSON 的新数据类型,可用于在列中存储 JSON 数据。该数据类型可以以紧凑和二进制格式存储 JSON 数据,使其比将 JSON 数据存储为字符串更有效。
  2. JSON 函数:MySQL 8 提供了一组内置函数,允许您提取和操纵 JSON 数据。例如,JSON_EXTRACT 函数允许您从 JSON 文档中提取值,JSON_ARRAY 函数允许您创建 JSON 数组,JSON_OBJECT 函数允许您创建 JSON 对象。
  3. JSON 索引:MySQL 8 提供了一个选项,使用 GENERATED 列索引 JSON 数据。这允许您对 JSON 数据执行有效的搜索和排序。
  4. JSON 验证:MySQL 8 提供了一个 JSON_VALID 函数,允许您验证字符串是否为有效的 JSON 文档。
  5. JSON 聚合:MySQL 8 提供了诸如 JSON_ARRAYAGGJSON_OBJECTAGG 等函数,允许您聚合 JSON 数据并将其作为单个 JSON 文档返回。

本文将详细讲解MySQL 8 的JSON 数据类型的使用方法。

二、MySQL 8 的环境搭建

我们使用 Docker 作为本地环境,使用 Docker 具有以下优点:

  1. 简化部署:Docker 容器可以在任何支持 Docker 的系统上部署,并且不会受到底层系统的限制。
  2. 提高可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,并且不需要担心应用程序的依赖关系。
  3. 提高安全性:Docker 容器在运行时独立于其他容器和操作系统,因此可以提高安全性。
  4. 提高可重复性:Docker 容器可以被保存和复制,因此可以提高开发、测试和生产环境之间的可重复性。
  5. 缩短开发周期:Docker 可以加速开发周期,因为它可以快速部署和测试应用程序。
  6. 减少资源消耗:Docker 可以节省系统资源,因为它可以共享操作系统内核,并且可以在同一系统上运行多个容器。
  7. 增强灵活性:Docker 可以根据您的需求轻松更改容器配置,以实现快速迭代和弹性。

在安装 Docker 环境之后,使用docker pull mysql:8拉取镜像到本地。

使用以下命令启动一个名为“mysql-8”的 MySQL 8 容器:

docker run --name mysql8 -e MYSQL_ROOT_PASSWORD=password -p 3310:3306 -d mysql:8

使用以下命令连接到启动的 MySQL 8 容器:

docker exec -it mysql-8 mysql -uroot -ppassword

也可以使用图形化客户端进行连接,在本系列中,我使用的 DBeaver 社区版本,免费开源的数据库图形化客户端。我们在创建连接是注意上面一步配置的端口是3310,下图为连接成功。

image-20230203122822226

三、创建数据库、数据表并插入默认数据

MySQL 8 支持 JSON 数据格式,并且 JSON 数据格式可以在 InnoDB 和 MyISAM 引擎上使用。

InnoDB 是 MySQL 中默认的数据引擎,支持事务、外键约束和其他高级功能。

接下来我们创建数据库,并创建一个带有JSON格式的表,插入数据。

CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

USE mydatabase;

CREATE TABLE mytable (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL,
  phone VARCHAR(255) NOT NULL,
  data JSON,
  UNIQUE KEY email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_General_ci;

INSERT INTO mytable (name, email, phone, data) VALUES 
("John Doe", "[email protected]", "555-555-5555", '{"address": {"city": "San Francisco", "state": "CA"}}'), 
("Jane Doe", "[email protected]", "555-555-5556", '{"address": {"city": "New York", "state": "NY"}}'), 
("Jim Smith", "[email protected]", "555-555-5557", '{"address": {"city": "Los Angeles", "state": "CA"}}');

创建完成。

image-20230203125548309

四、JSON格式数据的增加和查询

1. 增加一条带JOSN格式的数据

INSERT INTO mytable (name, email, phone, data) VALUES ('John Doe', '[email protected]', '555-555-5555', '{"address": "123 Main St", "city": "New York", "state": "NY"}');

注意,第四个字段 data 中存储的是一个 JSON 字符串。

2.查询JSON内数据

MySQL 8中查询json类型的数据可以使用->>运算符和->运算符。

->> 运算符可以提取json字段中的文本,而-> 运算符则可以提取json字段中的json对象。

例如,以下是使用 ->> 运算符查询json字段中的文本:

SELECT name, data->>'$.address.city' as city FROM mytable;

查询结果如下所示。

image-20230203180637755

以下是使用 -> 运算符查询json字段中的json对象:

SELECT name, data->'$.address' as city FROM mytable;

查询结果如下所示。

image-20230203180747588

3.带筛选条件的查询

在 MySQL 8 中查询带条件的 JSON 类型数据的方法如下:

使用 JSON 数据路径表达式:

SELECT name, email, phone, data->'$.address' as address, data->>'$.address.city' as city, data->>'$.address.state' 
FROM mytable 
WHERE data->'$.address.state' = 'NY';

查询结果如下所示。

image-20230203181247727

使用 JSON 函数:

SELECT name, email, phone, JSON_EXTRACT(data, '$.address') as address, JSON_EXTRACT(data, '$.address.city') as city, JSON_EXTRACT(data, '$.address.state') as state
FROM mytable 
WHERE JSON_EXTRACT(data, '$.address.state') = 'NY';

查询结果和上面的一致。

五、总结

这次我们介绍了MySQL 8 中对JSON支持的5个关键特性,并对JSON 数据类型的具体使用做了详细介绍。

标签:city,MySQL,数据类型,JSON,address,Docker,data
From: https://blog.51cto.com/u_13738137/6036026

相关文章

  • 数据类型
    数据类型强类型语言要求变量的使用要求严格符合规定,所有变量都必须先定义后才能使用Java是强类型语言弱类型语言Java的数据类型分为两大类基本数据类......
  • python-json的自定义编码器与自定义解码器
    json的数据类型有限,在实际业务中可能会遇到数据无法使用JSON编码的问题。如果我们需要转发的数据有大量或位置不规则的json无法解析数据类型时,事先处理就变成了一件比较麻......
  • shell脚本读取MySQL数据库并写入变量
    DB_HOST=...DB_PORT=...DB_USER=...DB_PASSWORD=...DB_NAME=...mysql="mysql-h$DB_HOST-P$DB_PORT-u$DB_USER-D$DB_NAME-s-e"exportMYSQL_PWD=$DB_PASSWORD......
  • 虹科产品 | 使用Redis企业版数据库为MySQL增添魅力!
    MySQL读取数据慢?难以轻松扩展?数据搜索效率低?无法实时分发数据集?针对以上问题,虹科Redis企业版数据库的解决方案来了!企业如果将Redis企业版数据库与MySQL一起使用,可以实现......
  • MySQL:锁
    锁的概述事务的隔离性数据库锁来实现。锁是计算机协调多个进程或线程并发访问某一资源的机制。锁冲突也是影响数据库并发访问性能的一个重要因素。所以锁对数据......
  • mysql常用语法汇总
    增删改查--新增insertintotb_student(`name`,age,sex,classid)values('李四',18,1,1);--删除deletefromtb_studentwhereid=1;--修改updatetb_students......
  • mysql数据库锁-设置读写锁
    有这样一个业务场景,比如另外一个团队的人只想要我们这边sit库的读权限,来查看数据。但是开发人员只有一个是数据库账号,也就是说对数据库读写权限都有的账号。那开发人员怎......
  • JS判断数据类型
    1:typeof只能判断基本数据类型数字,字符串、布尔复杂数据类型都是object1console.log(typeof"123");//string2console.log(typeof{});//object3console.lo......
  • MySQL 8.0 数据复制到 5.7
    场景公司后端机子给前端连接协同开发,但是又不太方便,正好我手上公司的电脑没有用,就准备拿来当专门的后端接口开发服务器然后就开始在本子上新搭一个环境,并迁移代码和数......
  • gin框架-参数绑定方法ShouldBind和BindJSON的区别
    Gin框架踩坑—[GIN-debug][WARNING]Headerswerealreadywritten.Wantedtooverridestatuscode400with200复现场景:使用结构体绑定方式接受参数,参数绑定失败,代码......