【MySQL】处理JSON数据

业务需要灵活的数据结构

通常,我们在使用MySQL这类关系型数据库时,会遵守一些准则来设计表结构。

但实际应用场景与“严格的单一准则”是有差距的。因为实际情况中需要考虑多方面的平衡作出妥协。

如,我们刚学完数据库原理时,往往会倾向于努力设计满足BC范式的表结构,或者至少是满足第三范式的表结构。

但当我们在解决实际工程问题时,可能会作出一些无法满足这些范式要求的表结构设计决议。这些设计在当时可能是一个不错的选择(即使事后我们可能会对自己大肆批判)。

如,我们可能会将“start_time”、“end_time”和“elapsed”三个字段共存,其中 elapsed = end_time - start_time 以减少计算量。这就不满足第三范式了

如,我们可能会让“user_id”和“user_name”这两个字段在task记录中共存,以减少连表查询。这就不满足第二范式了

而我们现在要说的JSON类型的字段则导致了“表中表”,不满足第一范式。

 

因为SQL(Structured Query Language,结构化查询语言)式的数据操作方式比较固化,而现实应用中又经常出现灵活性的需求。

虽然有各种NoSQL数据库可以解决很多这方面的问题,但出于各方面成本的考量,有时候我们会将数据都存在MySQL中。即,给部分数据各自分配一个字段固化,并留一个字段存储其它数据复合后的值。

如,对于一个Task表,我们可以将 'id','name',‘type’ 等数据各自分配一个字段固化,

而 'arg' 的结构因为 'type' 的不同也会不同,所以我们可以设置一个 'arg' 字段,存储Task各项参数复合后的数据。

我们可以自定义对这些复合数据字段的解析规则(也就是序列化和反序列化)。当然更多的是选取JSON作为这类字段的数据结构标准。

 

MySQL JSON 类型字段

以前,我们一般选用 MySQL 的 VARCHAR 或 TEXT 等作为这类复合数据字段的类型。

从5.7.8开始,MySQL将 JSON 作为标准的字段类型之一。

与JSON格式的纯文本字段相比,JSON类型的字段有以下优势:

  • 自动校验JSON格式。如果添加的数据不符合JSON规范将会报错。
    • 注意:MySQL中合法的JSON字符串格式与我们通常处理的JSON数据可能有些不同。某些场景下,我们习惯将JSON字符串解析成对象({...})或数组([...]),而不考虑单个值的情况(如:“1”)。
  • 存储格式经过优化。读取JSON内容项的速度更快。
    • 因为MySQL提供的内部数据结构允许通过内容项的key或index直接访问目标数据,而无需将处理其它数据。比以前的上层应用读取整块内容再解析的方式更快。

注:

  • 虽然JSON字段可以存储的数据量很大,但它也受 max_allowed_packet 的限制
  • 不能为JSON字段指定默认值,即JSON字段默认值是NULL
  • 虽然可以通过JSON_EXTRACT方法创建Generated Column字段,再通过该字段创建索引。
    • 但这种做法的意义值得商榷,因为既然把该字段的信息放入JSON字段,可能意味着它并不是一个值得固化的标准属性字段,即使它是Generated Column也显得“污染”太重。

示例

创建表

 

CREATE TABLE `t1` (
  `id` INT NOT NULL,
  `f1` VARCHAR(45) NULL,
  `f2` JSON NULL,
  PRIMARY KEY (`id`));

 

 

创建 JSON 字段数据

  • 方式1:直接将序列化后的JSON文本存入字段
insert into t1 values (1, 'alpha', '{"a":1, "b":"two"}');

 

 

insert into t1 values (1, 'alpha', JSON_OBJECT("a", 1, "b", "two"));
insert into t1 values (2, 'beta', JSON_ARRAY("i1", 2, 3.4));
insert into t1 values (
  1,
  'alpha',
  JSON_MERGE(
    '{"a":1}',
    '{"b":"two"}'
  )
);
insert into t1 values (
  1,
  'alpha',
  JSON_MERGE(
    JSON_OBJECT("a", 1),
    JSON_OBJECT("b", "two")
  )
);
insert into t1 values (
  1,
  'alpha',
  JSON_MERGE(
    JSON_OBJECT("a", 1),
    '{"b": "two"}'
  )
);

 

 

注:

  • 从 MySQL 5.7.22 开始,JSON_MERGE 被 JSON_MERGE_PRESERVE 替代
  • 记得规划好JSON字段内部的业务数据结构,不要被自己搞混
    • 另外,可通过 JSON_TYPE 方法查看JSON字段的类型
select f2, JSON_TYPE(f2) from t1;
+----------------------+---------------+
| f2                   | json_type(f2) |
+----------------------+---------------+
| {"a": 1, "b": "two"} | OBJECT        |
| ["1", 2, 3.4]        | ARRAY         |
+----------------------+---------------+

 

读取 JSON 字段中的内容项

  • 可通过 JSON_EXTRACT 方法获取 JSON 字段中的某部分数据

 

select f2 from t1 where json_extract(f2, '$.b') = 'two';
+----------------------+
| f2                   |
+----------------------+
| {"a": 1, "b": "two"} |
+----------------------+

 

  • 或使用 JSON_EXTRACT 方法的简化形式 ‘->’

 

select f2 from t1 where f2->'$[1]' = 2;
+---------------+
| f2            |
+---------------+
| ["1", 2, 3.4] |
+---------------+

 

 

更改 JSON 字段中的内容项

除了直接将序列化后的JSON文本存入字段外,还可以使用 JSON_INSERTJSON_REPLACEJSON_SETJSON_ARRAY_INSERT 等方法满足不同的需求

 

update t1 set f2 = JSON_INSERT(f2, '$.c', '3') where id=1;
update t1 set f2 = JSON_REPLACE(f2, '$.c', '1+1+1') where id=1;
update t1 set f2 = JSON_SET(f2, '$.c', '1+2') where id=1;

 

  • JSON_INSERT:增加内容项;如果内容项(key)已存在,则不做任何改动
  • JSON_REPLACE:替换内容项;如果内容项(key)不存在,则不做任何改动
  • JSON_SET:设置内容项;如内容项(key)已存在,则替换原值;如果内容项(key)不存在,则添加该内容项

因为有时候JSON字段的原值可能是 NULL(JSON字段默认值是NULL),所以上述方法会失效。这时可以使用 COALESCE 方法指定一个初始值。

 

update t1 set f2 = JSON_SET(COALESCE(f2, '{}'), '$.a', '1') where id=3;

 

 

删除 JSON 字段中的内容项

通过 JSON_REMOVE 方法删除内容项

 

update t1 set f2 = JSON_REMOVE(f2, '$.c') where id=1;

 

*修改部分内容

MySQL 8 会对JSON字段部分内容的修改操作进行优化,它是真的只修改部分内容项,而不是创建一个新的整字段值做整体替换。

 

但是条件比较苛刻:

  • 所更新的字段必须是JSON类型
  • 只能通过 JSON_SET、JSON_REPLACE、JSON_REMOVE 这三个方法对字段进行赋值
  • 且这些方法的输入字段必须是要更新的那个字段
  • 更新操作只能是操作已有的内容项,不能增加内容项
  • 新字段值所占用的存储空间不能比原值多(如果目标字段原来所剩的空间足以满足新增的空间需求,也符合优化条件)

如果将系统变量 binlog_row_value_options 设置为 PARTIAL_JSON,这些部分内容修改的操作也会被记录到 Binary Log 中。

 

 

 

更多MySQL JSON 方法:More

JSON值的比较与排序:Comparison and Ordering of JSON Values (可考虑使用 CAST 方法作为辅助)

MySQL 处理JSON字符串 现在很多数据会以json格式存储,如果你还在用like查询json字符串,那你就OUT了, MySQL从5.6版本就开始支持json字符串查询了~下面来看看MySQL中支持的json处理函数吧!MySQL支持定义的原生JSON数据类型 由RFC 7159支持高效访问JSON数据 (JavaScript Object Notation)文档。的JSON数据类型提供了这些优势, 在字符串列中存储JSON格式的字符串:自动验证存储在JSON列。无效的文档将生成 错误.优化存储格式。JSON文档存储在。 阅读详情

相关推荐

MySQL JSON 常用函数

MySQL 提供了丰富的函数对 JSON 类型执行操作,详见。

3351

MySQLjson数据操作

当然了,5.7的版本只是最基础的版本,对于海量数据的效率是远远不够的,不过这些都在mysql8.0解决了。写到这里大家都发现了,我们查询的json都是整条json数据,这样看起来不是很方便,那么如果我们只想看json中的某个字段怎么办?事例:比如我们想针对id=2的数据新增一组:newData:新增的数据,修改deptName为新增的部门1。如果我们再执行以下刚才的那个sql,只是换了value,我们会看到里面的key值不会发生变化。如果我们要更新id=2数据中newData2的值为:更新的数据2。

LiZhen314的博客 3293

MySQL处理JSON数据:大数据分析的新方向

MySQL处理JSON数据已经成为了一种常见的需求,尤其是在处理Web应用的动态数据时。在MySQL处理JSON数据具有较高的灵活性和扩展性,能够满足大多数的应用场景需求。随着MySQLJSON支持的不断增强,未来处理JSON数据的方式可能会更加多样化和高效。

丁爸的博客 1772

mysql处理json格式的字段,一文搞懂mysql解析json数据

JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档。 MySQL 8.0版本中增加了对JSON类型的索引支持。可以使用CREATE INDEX语句创建JSON类型的索引,提高JSON类型数据的查询效率。 存储JSON文档所需的空间存储LONGBLOB或LONGTEXT所需的空间大致相同。 在MySQL 8.0.13之前,JSON列不能有非空的默认值。 JSON 类型比较适合存储一些列不固定、修改较少

秃了也弱了 3万+

MySQL JSON数据类型全解析(JSON datatype and functions)

JSON(JavaScript Object Notation)是一种常见的信息交换格式,其简单易读且非常适合程序处理MySQL从5.7版本开始支持JSON数据类型,本文对MySQLJSON数据类型的使用进行一个总结。

最简单的方法,解决最实际的问题。 1万+

MySQL处理JSON数据

MySQL处理JSON数据已成为大数据分析领域的一个新方向,这一功能自MySQL 5.7版本引入以来,为数据库管理系统在处理非结构化数据方面提供了强大的支持。以下是对MySQL处理JSON数据的详细探讨,包括其引入的背景、特性、函数操作符、性能优化以及在大数据分析中的应用等方面。

shiming8879的博客 1288

Mysql使用函数json_extract处理Json类型数据

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

靖节先生的博客 2万+

SpringBoot中如何处理MySQL中存储的JSON数据

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

路漫漫其修远兮,吾将上下而求索 5181

MySQL查询处理 JSON 数据

本文介绍了MySQL 提供的 JSON 数据处理函数,可以方便的进行数据查询,并结合具体示例进行测试,希望对你有所帮助。

u012948302的专栏 1164

一文详解如何在MySQL处理JSON数据例子解析

MySQL处理JSON数据是一项强大的功能,特别是从5.7版本开始,它提供了原生的JSON数据类型支持。以下是如何在MySQL处理JSON数据的一些详细例子和指南。

IT老农民的博客 761

MySQL处理Json数据

mysql 处理json数据

只是甲的博客 4948

mysql json数据引号处理

问题描述:新版本中引入的json数据检索时获取某字段值时带引号 场景: 查看mysql版本:select version(); 数据库数据:tabel表中data 字段中的数据 数据取出后格式化如下(假数据): { "address": { "zip": "29730", "city": "Rock Hill", "stat...

SongJingzhou的博客 4009

MySQL处理JSON数据案例示范和常见问题以及性能优化

本文将为您全面概述 MySQLJSON 数据的支持情况。深入探讨处理 JSON 数据的常用函数,如 JSON_EXTRACT 、 JSON_INSERT 等,让您轻松应对各类数据操作需求。同时,详细介绍 MySQL 处理 JSON 数据的丰富使用场景,还会剖析 MySQL 处理 JSON 数据可能存在的性能隐患,如索引优化不足、大量数据处理困难等,并给出切实可行的解决方案,助您在 MySQL 中高效处理 JSON 数据,提升系统性能。

J老熊 2324

MYSQL处理JSON数据处理

数据表中有存有JSON数据,不能直接食用,需要拆解,利用MYSQL进行JSON数据处理 select JSON_EXTRACT('JSON字段','$.Key') ; 语句很简单,主要是要注意两点 1、JSON_EXTRACT 可以嵌套使用:往往一次解析无法拿到结果,可以嵌套获取JSON数据。 2、JSON中有[], 可以在字段后用[0]\[1]\[2] 进行数据获取。 SELECT JSON_EXTRACT(JSON_EXTRACT(JSON_EXTRACT(a.retinfo,'$.res

Freshboya的博客 1183

MySQL处理JSON数据有哪些限制?

单行长度限制‌:‌在InnoDB存储引擎中,‌JSON数据类型可以存储最大65,535字节的数据;‌而在MyISAM存储引擎中,‌JSON数据类型可以存储最大4GB的数据数据类型限制‌:‌虽然JSON数据类型提供了诸多优势,‌如自动验证JSON数据的有效性等,‌但它仍然受到MySQL数据类型的一般限制,‌例如,‌无法存储超过其最大长度限制的数据。在设计数据库表结构时,‌需要根据实际情况合理规划JSON字段的大小,‌以避免因超过限制而导致的错误‌。MySQL处理JSON数据时,‌主要存在以下限制:‌。

cesske的博客 3087

探索数据处理新维度:json-to-mysql——简化JSONMySQL的桥梁

探索数据处理新维度:json-to-mysql——简化JSONMySQL的桥梁 在快速迭代的技术时代,数据库操作一直是开发者日常工作中不可或缺的一部分。当面对海量的JSON数据MySQL数据库的交互时,json-to-mysql项目如同一缕清风,吹散了传统数据导入过程中的复杂繁琐,为开发者提供了一条高效、灵活的数据处理路径。 项目介绍 json-to-mysql是一个轻量级而强大的工具,它允...

gitblog_00064的博客 519

kettle实战——对大量json文件的数据进行两层解析处理后导入MYSQL数据库

kettle实战——对大量json文件的数据进行两层解析处理后导入MYSQL数据库中1、简介2、要处理数据3、数据处理4、 使用kettle处理数据4.1、整体流程4.2、具体操作总结 1、简介 将外部数据导入(import)数据库是在数据库应用中一个很常见的需求。json作为轻量文件在储存大量数据上具有很强的应用性,本文将介绍如何利用kettle对大量json文件的数据进行处理并导入到mysql数据库中。 2、要处理数据处理的文件格式并不是json格式的,但内容的接送形式的,因此首先要讲文件格式

weixin_47657546的博客 5582

MySQL遇上JSON 一文处理Mysql中的JSON数据 Mysql如何处理嵌套的JSON结构

在这篇文章中,我们探讨了MySQLJSON数据类型的增删改查操作,以及它们的运行原理和应用场景。JSON数据类型为数据库设计带来了新的灵活性和可能性,作为一名Java架构师,掌握这些技能将极大地提升你的技术实力。

赵KK的博客 2226
上一篇: JVM服务端常用启动配置(JDK8)(简易版)
下一篇: 【MySQL】处理 JSON 的内建方法(函数)
一个被IT搞的
博客等级 码龄15年 21粉丝 236原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值