视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
【原创】MySQL5.7JSON类型使用介绍
2020-11-09 16:14:22 责编:小采
文档


JSON是一种轻量级的数据交换格式,采用了于语言的文本格式,类似XML,但是比XML简单,易读并且易编写。对机器来说易于解析和生成,并且会减少网络带宽的传输。 JSON的格式非常简单:名称/键值。之前MySQL版本里面要实现这样的存储,要么用VARCHAR要么用T

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

JSON的格式非常简单:名称/键值。之前MySQL版本里面要实现这样的存储,要么用VARCHAR要么用TEXT大文本。 MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析。 我们先看看MySQL老版本的JSON存取。


示例表结构:

CREATE TABLE json_test(
id INT,
person_desc TEXT
)ENGINE INNODB;

我们来插入一条记录:

INSERT INTO json_test VALUES (1,'{
 "programmers": [{
 "firstName": "Brett",
 "lastName": "McLaughlin",
 "email": "aaaa"
 }, {
 "firstName": "Jason",
 "lastName": "Hunter",
 "email": "bbbb"
 }, {
 "firstName": "Elliotte",
 "lastName": "Harold",
 "email": "cccc"
 }],
 "authors": [{
 "firstName": "Isaac",
 "lastName": "Asimov",
 "genre": "sciencefiction"
 }, {
 "firstName": "Tad",
 "lastName": "Williams",
 "genre": "fantasy"
 }, {
 "firstName": "Frank",
 "lastName": "Peretti",
 "genre": "christianfiction"
 }],
 "musicians": [{
 "firstName": "Eric",
 "lastName": "Clapton",
 "instrument": "guitar"
 }, {
 "firstName": "Sergei",
 "lastName": "Rachmaninoff",
 "instrument": "piano"
 }]
}');


那一般我们遇到这样来存储JSON格式的话,只能把这条记录取出来交个应用程序,有应用程序来解析。



现在到了MySQL5.7,我们重新修改下表结构:

ALTER TABLE json_test MODIFY person_desc json;


先看看插入的这行JSON数据有哪些KEY:

mysql> SELECT id,json_keys(person_desc) as "keys" FROM json_test\G
*************************** 1. row ***************************
 id: 1
keys: ["authors", "musicians", "programmers"]
1 row in set (0.00 sec)


我们可以看到,里面有三个KEY,分别为authors,musicians,programmers。那现在找一个KEY把对应的值拿出来:

mysql> SELECT json_extract(AUTHORS,'$.lastName[0]') AS 'name', AUTHORS FROM
 -> (
 -> SELECT id,json_extract(person_desc,'$.authors[0][0]') AS "authors" FROM json_test
 -> UNION ALL
 -> SELECT id,json_extract(person_desc,'$.authors[1][0]') AS "authors" FROM json_test
 -> UNION ALL
 -> SELECT id,json_extract(person_desc,'$.authors[2][0]') AS "authors" FROM json_test
 -> ) AS T1
 -> ORDER BY NAME DESC\G
*************************** 1. row ***************************
 name: "Williams"
AUTHORS: {"genre": "fantasy", "lastName": "Williams", "firstName": "Tad"}
*************************** 2. row ***************************
 name: "Peretti"
AUTHORS: {"genre": "christianfiction", "lastName": "Peretti", "firstName": "Frank"}
*************************** 3. row ***************************
 name: "Asimov"
AUTHORS: {"genre": "sciencefiction", "lastName": "Asimov", "firstName": "Isaac"}
3 rows in set (0.00 sec)



现在来把详细的值罗列出来:

mysql> SELECT
 -> json_extract(AUTHORS,'$.firstName[0]') AS "firstname",
 -> json_extract(AUTHORS,'$.lastName[0]') AS "lastname",
 -> json_extract(AUTHORS,'$.genre[0]') AS "genre"
 -> FROM
 -> (
 -> SELECT id,json_extract(person_desc,'$.authors[0]') AS "authors" FROM json
_test
 -> ) AS T\G
*************************** 1. row ***************************
firstname: "Isaac"
 lastname: "Asimov"
 genre: "sciencefiction"
1 row in set (0.00 sec)


我们进一步来演示把authors 这个KEY对应的所有对象删掉。

mysql> UPDATE json_test
 -> SET person_desc = json_remove(person_desc,'$.authors')\G
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

查找下对应的KEY,发现已经被删除掉了。

mysql> SELECT json_contains_path(person_desc,'all','$.authors') as authors_exist
s FROM json_test\G
*************************** 1. row ***************************
authors_exists: 0
1 row in set (0.00 sec)



总结下, 虽然MySQL5.7 开始支持JSON数据类型,但是我建议如果要使用的话,最好是把这样的值取出来,然后在应用程序段来计算,毕竟数据库是用来处理简单数据的。

下载本文
显示全文
专题