一 前言

MySQL 5.7.8 之后 支持 JSON (由rfc7159规定)数据类型,其能在字段中使用json 类型,做到了自动校验是否为json类型数据,否则插入数据会报异常;其次,储存json数据内部做到了优化储存,能够快速读取json类型数据,比如无需将二进制json转为文本形式后读取;

公众号:知识追寻者

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

二 操作 JOSN

建表语句如下,为 area 字段 声明为 JSON 类型;

CREATE TABLE `order` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号',

`order_name` varchar(255) DEFAULT NULL COMMENT '订单名称',

`create_time` datetime DEFAULT NULL COMMENT '创建时间',

`year` year(4) DEFAULT NULL COMMENT '年份',

`area` json DEFAULT NULL COMMENT '地区',

PRIMARY KEY (`id`),

UNIQUE KEY `order_name` (`order_name`,`create_time`)

) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

MySQL 中支持 json 对象 和json 数组,他们之间可以相互嵌套;json类似map,在java中json就是map得实现类,初学者若不懂何为json,就当作map来用,即储存 key - value 形式得数据结构;注意点是 json 数据 得key 必须是字符串,可以有key无value;

2.1 插入 josn数据

插入 json 对象,east 得值 为 50 , sourth 值为65 得 json对象;

INSERT INTO `order`(`order_name`, `year`, `area`)

VALUES ('荷小花的订单', 2020, '{"east": "50", "south": "65"}');

等效于使用 JSON_OBJECT 函数, 示例如下

INSERT INTO `order`(`order_name`, `year`, `area`)

VALUES ('荷小花的订单', 2020, JSON_OBJECT("east", "50", "south", "65"));

插入 json 数组

INSERT INTO `order`(`order_name`, `year`, `area`)

VALUES ('荷小花的订单', 2020, '[{"east": "50", "south": "65"}]');

等效于使用 JSON_ARRAY 函数,示例如下

INSERT INTO `order`(`order_name`, `year`, `area`)

VALUES ('荷小花的订单', 2020, JSON_ARRAY("east", "50", "south", "65"));

2.2 查询json数据

使用 column - path 路径符 -> 查询 指定key 得值,

select order_name, area -> '$.east' from `order`

注意,如果json 数据中不存在 east 得键,则列出为null值

输出如下

--------- ------

荷小花的订单"50"

荷小花的订单

也可以使用 ->> 符号, 不同之处是使用 ->> 更加直观,输出得json数据最外层不会携带双引号,内层数据中存在双引号不会有反斜杠转义;

select order_name, area ->> '$.east' from `order`

使用 单引号 代替 双引号

select order_name, area ->> "$.east" from `order`

我们 也可以使用 JSON_EXTRACT 函数 达到同样得效果;

SELECT order_name,JSON_EXTRACT(area, '$.east') from `order`;

2.3 修改json数据

使用 JSON_SET 设置 json key 得 值

id = 1 得 area 数据如下

{"north": "55", "south": "66"}

现在将south 值改为 60 的语句示例如下

update `order` set area = json_set(area, '$[0].south', '60') where id = '1'

其中 $[0] 代表 json 中的第一个对象 ,以此类推 $[1] 为 josn 中的第二个对象;

示例

["6","2",{"east": "50", "south": "65"}]

$[0] 为"6",$[1] 为 "2" , $[2] 为 {"east": "50", "south": "65"}; $[2].east 为 "50" , 或者 $[2][1];

如果上面$[*] 表达式式理解困难也可以使用如下方式

update `order` set area = json_set(area, '$.south', '60') where id = '1'

tip: 如果更改整个json值 与 平时的更新数据方式一致

2.4 删除json中的数据

使用 json_remove 可以达到效果;

示例: 删除json 中的 south 键

update `order` set area =json_remove(area, '$.south') where id = '1'

三 jsom函数

3.1 cast

cast 函数 是特殊函数,可以使用 CAST(expr AS type) 函数进行数据类型得转换,此函数 与 convert 用法 类似 ,即 期望得表达式转为期望得类型;

比如 将 字符串 知识追寻者从默认类型转为utf8类型

SELECT CONVERT('知识追寻者' USING utf8);

如下情况下查询是字符串,非json数据

select '{"east": "50", "south": "65"}' as str

再来看看 cast 函数使用,将字符串转为json 类型

select cast( '{"east": "50", "south": "65"}' as json )

3.2 JSON_TYPE

JSON_TYPE 函数 会尝试 去解析 参数为json值,

示例

select JSON_TYPE('{"east": "50", "south": "65"}')

得到结果为json 对象

OBJECT

示例

select JSON_TYPE('[{"east": "50", "south": "65"}]')

得到结果为json数组

ARRAY

示例

select JSON_TYPE('hello')

输出为异常,无效得json

Invalid JSON text in argument 1 to function json_type: "Invalid value." at position 0.

3.3 JSON_MERGE

JSON_MERGE 函数 即 将合并多个json文档; 合并规则如下

如果都是json array,合并为json array;

如果都是json object,合并为json object;

如果有多种类型数据,则将非json array的元素封装成json array再按照如上规则进行合并;

示例

select json_merge('["west","20"]', '{"east": "50", "south": "65"}')

输出

["west", "20", {"east": "50", "south": "65"}]

3.4 JSON_VALID

JSON_VALID 函数 为 校验是否是json 函数,是返回 1 ,否则 返回0;

示例如下,返回1;

SELECT JSON_VALID('{"east": "50", "south": "65"}')

示例如下,返回 0;

SELECT JSON_VALID('hello')

3.5 JSON_INSERT

JSON_INSERT 函数 向 json 中添加新的值,不会改变已经存在的值;

id = 1 的数据如下

{"north": "55"}

更新语句如下

update `order` set area =JSON_INSERT(area, '$.north', 55 ,'$.south', "60") where id = '1'

更改结果如下

{"north": "55", "south": "60"}

3.6 JSON_REPLACE

JSON_REPLACE 替换现有的值,如果存在新的值不会添加;

id = 1 的数据如下

{"north": "55", "south": "60"}

更新语句如下

update `order` set area =JSON_REPLACE (area, '$.north', "50" ,'$.east', "60")

where id = '1'

更改结果如下

{"north": "50", "south": "60"}

3.7 JSON_SEARCH

JSON_SEARCH , 返回路径,支持返回单个和返回多个;

id = 1 的数据如下

[{"north": "50", "south": "60"}, {"north": "50", "south": "70"}]

查询 一个值为 50 的key路径

select JSON_SEARCH(area, 'one', '50') from `order` where id = '1'

输出

"$[0].north"

查询 所有值为 50 的key路径

select JSON_SEARCH(area, 'all', '50') from `order` where id = '1'

输出

["$[0].north", "$[1].north"]

3.8 JSON_KEYS

返回json顶级值底下所有key

id = 1 的数据如下

[{"north": "50", "south": "60"}, {"north": "50", "south": "70"}]

查询json数据中第一个json对象所有的key

select JSON_KEYS(area, '$[0]') from `order` where id = '1'

输出

["north", "south"]

mysql操作json优点和缺点_SQL-mysql操作json相关推荐

  1. mysql sql查询json数据类型_SQL中的JSON数据类型

    SQL中的JSON数据类型 概述 MySQL支持原生JSON类型,使用JSON数据类型相较于将JSON格式的字符串存储在String型中的优势有: 存储时会自动验证JSON文本: 可以优化存储格式.存 ...

  2. mysql操作json优点和缺点_mysql之使用json

    从mysql 5.7开始才有 创建表(含有json类型) CREATE TABLE `emp_details` ( `emp_no` int(11) NOT NULL, `details` json ...

  3. mysql select 返回列_SQL / mysql – selectdistinct / UNIQUE,但返回所有列?

    你正在寻找一个组: select * from table group by field1 偶尔可以写一个独特的声明: select distinct on field1 * from table 然 ...

  4. mysql操作json优点和缺点_详解Mysql中的JSON系列操作函数

    前言 JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写.对机器来说易于解析和生成,并且会减少网络带宽的传输. JSON的格式非常简单:名称/ ...

  5. mysql操作json优点和缺点_MYSQL 5.7中的本机JSON支持:MYSQL中JSON数据类型的优缺点是什么?...

    在MySQL 5.7中,新的数据类型用于在JSON表中存储JSON数据. 添加. 显然,这将是MySQL的巨大变化. 他们列出了一些好处 Document Validation - Only vali ...

  6. Spark SQL与外部数据源的操作(Spark SQL ——> CSV/JSON/Parquet/hive/mysql)

    目录 一.Spark SQL支持的外部数据源 二.Spark SQL -> CSV 2.1 读CSV文件 a.有列名 b.无列名 2.2 写CSV文件 三.Spark SQL -> JSO ...

  7. mysql json类型数组索引_MySQL JSON 类型数据操作

    1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...

  8. mysql json函数_Mysql里的JSON系列操作函数

    新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询.修改等操作,下面就实际体验一下 创建带有 JSON 字段的表 比如一 ...

  9. json mysql 字段 默认值_MySQL中的JSON类型

    前言(废话) 昨天抽了点时间在网上搜列了一个开源项目,项目挺完整的,前后台分离还带有微信小程序,我Clone下代码,经过一番倒腾,嘿~还真就跑起来了.在这个过程中,体验了一把VUE项目工程细节,因为之 ...

最新文章

  1. 腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知...
  2. How to configure cross-stack EtherChannel on Cisco Catalyst 3750 switches
  3. 《TCP/IP图解》读书笔记
  4. win10不能访问局域网共享
  5. 文字链接_新生命道目录及音频、文字链接(20200501更新)
  6. python语言程序设计实践教程上海交通大学_《C语言实验与等级考试指导》隋雪莉 闵 芳 沈国荣著【摘要 书评 在线阅读】-苏宁易购图书...
  7. Bootstrap 表格的默认样式
  8. percona-toolkit 之 【pt-deadlock-logger】说明
  9. [手把手教你] 用Swoft 搭建微服务(TCP RPC)
  10. 动易 转 html5,动易系统所有标签解释5
  11. 【Multisim仿真】数字电路仿真16路往复流水灯
  12. 国美易卡线上操作流程,国美易卡利用科技力量
  13. spring boot+thymeleaf+layui实现后台管理系统界面
  14. opencv录制视频 python_OpenCV Python 录制视频
  15. opencv 切取红色
  16. 玉米社:SEM竞价搜索推广移动优先还是PC优先,怎么设置?
  17. nacos安装和配置
  18. Kali Linux 使用记录
  19. 运筹说 第66期|贝尔曼也有“演讲恐惧症”?
  20. greenplum数据库的使用

热门文章

  1. 数据结构——树的C语言实现
  2. 牛客16502 螺旋矩阵
  3. CentOS 7 安装并启动Nginx
  4. JSP页面元素,内置对象及request详解
  5. POSIX互斥锁api函数
  6. QT+OpenCV综合示例:图像混合(滑动条)
  7. OpenCV中的函数子
  8. 冈萨雷斯《数字图像处理》读书笔记(三)——空间滤波
  9. TCP/IP校验和(浅析+实例)
  10. Python编程从入门到实践~文件读取