您现在的位置是:首页 > 文章详情

10分钟了解MySQL5.7对原生JSON的支持与用法

日期:2016-09-28点击:586

wKioL1ftzemTuZrlAAA4eVx2Dz8486.jpg


Part1:JSON格式的支持

MySQL5.7版本终于支持了原生的JSON格式,即将关系型数据库和文档型NO_SQL数据库集于一身。本文接下来将对这特性分别就MySQL5.7和MariaDB10.1各自实现的方法异同进行介绍和演示。


Part2:创建相应表结构


[root@HE3 ~]# mysql -V

mysql  Ver 14.14 Distrib 5.7.15, for linux-glibc2.5 (x86_64) using  EditLine wrapper


mysql> create database helei; Query OK, 1 row affected (0.00 sec) mysql> use helei; Database changed mysql> create table helei (id int(10) unsigned NOT NULL,context json default null,primary key(id)); Query OK, 0 rows affected (0.02 sec) mysql> show create table helei \G *************************** 1. row ***************************        Table: helei Create Table: CREATE TABLE `helei` (   `id` int(10) unsigned NOT NULL,   `context` json DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.02 sec)


Part3:构造数据&测试

mysql> desc helei; +---------+------------------+------+-----+---------+-------+ | Field   | Type             | Null | Key | Default | Extra | +---------+------------------+------+-----+---------+-------+ | id      | int(10) unsigned | NO   | PRI | NULL    |       | | context | json             | YES  |     | NULL    |       | +---------+------------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> insert into helei values(1,'{"name":"贺磊","age":100}'),(2,'{"name":"陈加持","age":30}'),(3,'{"name":"于浩","age":28}'); Query OK, 3 rows affected (0.00 sec) Records: 3  Duplicates: 0  Warnings: 0 mysql> select * from helei; +----+----------------------------------+ | id | context                          | +----+----------------------------------+ |  1 | {"age": 100, "name": "贺磊"}     | |  2 | {"age": 30, "name": "陈加持"}    | |  3 | {"age": 28, "name": "于浩"}      | +----+----------------------------------+ 3 rows in set (0.00 sec) mysql> select id,JSON_EXTRACT(context,'$.name') name,JSON_EXTRACT(context,'$.age') age from helei; +----+-------------+------+ | id | name        | age  | +----+-------------+------+ |  1 | "贺磊"      | 100  | |  2 | "陈加持"    | 30   | |  3 | "于浩"      | 28   | +----+-------------+------+ 3 rows in set (0.00 sec) 获取Key-Value mysql> select id,json_keys(context) from helei; +----+--------------------+ | id | json_keys(context) | +----+--------------------+ |  1 | ["age", "name"]    | |  2 | ["age", "name"]    | |  3 | ["age", "name"]    | +----+--------------------+ 3 rows in set (0.00 sec) 获取全部Key mysql> update helei set context=JSON_INSERT(context,'$.name',"贺磊",'$.address','beijing')where id=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1  Changed: 1  Warnings: 0 mysql> select * from helei; +----+------------------------------------------------------+ | id | context                                              | +----+------------------------------------------------------+ |  1 | {"age": 100, "name": "贺磊", "address": "beijing"}   | |  2 | {"age": 30, "name": "陈加持"}                        | |  3 | {"age": 28, "name": "于浩"}                          | +----+------------------------------------------------------+ 3 rows in set (0.00 sec) 增加Key-Value mysql> update helei set context=JSON_SET(context,'$.name',"高穷帅")where id=1; Query OK, 1 row affected (0.01 sec) Rows matched: 1  Changed: 1  Warnings: 0 mysql> select * from helei; +----+---------------------------------------------------------+ | id | context                                                 | +----+---------------------------------------------------------+ |  1 | {"age": 100, "name": "高穷帅", "address": "beijing"}    | |  2 | {"age": 30, "name": "陈加持"}                           | |  3 | {"age": 28, "name": "于浩"}                             | +----+---------------------------------------------------------+ 3 rows in set (0.00 sec) 变更key-value mysql> update helei set context=JSON_REMOVE(context,'$.name') where id=1; Query OK, 1 row affected (0.01 sec) Rows matched: 1  Changed: 1  Warnings: 0 mysql> select * from helei; +----+------------------------------------+ | id | context                            | +----+------------------------------------+ |  1 | {"age": 100, "address": "beijing"} | |  2 | {"age": 30, "name": "陈加持"}      | |  3 | {"age": 28, "name": "于浩"}        | +----+------------------------------------+ 3 rows in set (0.00 sec) 删除Key-Value



JSON格式存储BLOB的测试

Part1:Dynamic Columns处理方式的异同

MySQL5.7的动态列JSON格式存储

mysql> insert into helei_blob values(1,'{"name":"贺磊","age":100}'),(2,'{"name":"陈加持","age":30}'),(3,'{"name":"于浩","age":28}'); Query OK, 3 rows affected (0.01 sec) Records: 3  Duplicates: 0  Warnings: 0 mysql> select * from helei_blob; +----+-------------------------------+ | id | blob_col                      | +----+-------------------------------+ |  1 | {"name":"贺磊","age":100}     | |  2 | {"name":"陈加持","age":30}    | |  3 | {"name":"于浩","age":28}      | +----+-------------------------------+ 3 rows in set (0.00 sec)


MariaDB的动态列JSON格式存储

MariaDB [helei]> create table helei (id int(10) unsigned NOT NULL,context json default null,primary key(id)); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'json default null,primary key(id))' at line 1 可以看到MariaDB并不能直接存储JSON类型。 MariaDB [helei]> show create table helei_blob\G; *************************** 1. row ***************************        Table: helei_blob Create Table: CREATE TABLE `helei_blob` (   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `blob_col` blob,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) ERROR: No query specified MariaDB [helei]> insert into helei_blob values(5,column_create('color','blue','size','XL')); Query OK, 1 row affected (0.01 sec) MariaDB [helei]> select * from helei_blob; +----+--------------------------------+ | id | blob_col                       | +----+--------------------------------+ |  1 | {"name":"贺磊","age":100}      | |  2 | {"name":"陈加持","age":30}     | |  3 | {"name":"于浩","age":28}       | |  5 |        3 sizecolor!XL!blue | +----+--------------------------------+ 4 rows in set (0.00 sec) 直接查询是乱码需用以下函数查询 MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id =5; +----+------------------------------+ | id | column_json(blob_col)        | +----+------------------------------+ |  5 | {"size":"XL","color":"blue"} | +----+------------------------------+ 1 row in set (0.00 sec) MariaDB [helei]> select id,column_list(blob_col) from helei_blob where id =5; +----+-----------------------+ | id | column_list(blob_col) | +----+-----------------------+ |  5 | `size`,`color`        | +----+-----------------------+ 1 row in set (0.00 sec) 获取全部Key MariaDB [helei]> select id,column_get(blob_col,'color' as char) as color from helei_blob where id =5; +----+-------+ | id | color | +----+-------+ |  5 | blue  | +----+-------+ 1 row in set (0.00 sec) 获取Key-Value MariaDB [helei]> update helei_blob set blob_col=column_add(blob_col,'sex','man') where id=5; Query OK, 1 row affected (0.00 sec) Rows matched: 1  Changed: 1  Warnings: 0 MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id=5; +----+------------------------------------------+ | id | column_json(blob_col)                    | +----+------------------------------------------+ |  5 | {"sex":"man","size":"XL","color":"blue"} | +----+------------------------------------------+ 1 row in set (0.00 sec) 增加Key-Value MariaDB [helei]> update helei_blob set blob_col=column_add(blob_col,'color','black') where id=5; Query OK, 1 row affected (0.00 sec) Rows matched: 1  Changed: 1  Warnings: 0 MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id=5; +----+-------------------------------------------+ | id | column_json(blob_col)                     | +----+-------------------------------------------+ |  5 | {"sex":"man","size":"XL","color":"black"} | +----+-------------------------------------------+ 1 row in set (0.00 sec) 更改Key-Value MariaDB [helei]> update helei_blob set blob_col=column_delete(blob_col,'sex','man') where id=5; Query OK, 1 row affected (0.01 sec) Rows matched: 1  Changed: 1  Warnings: 0 MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id=5; +----+-------------------------------+ | id | column_json(blob_col)         | +----+-------------------------------+ |  5 | {"size":"XL","color":"black"} | +----+-------------------------------+ 1 row in set (0.00 sec) 删除Key-Value



——总结——

虽然MySQL5.7和MariaDB10.0/10.1版本对于JSON的支持是比较完整的,不过MongoDB的Sharding功能更加好用,个人更倾向于MongoDB。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

原文链接:https://blog.51cto.com/suifu/1857270
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章