概述
MySQL5.7的发行声明中,官方称之为里程碑式的版本,除了运行速度大幅度提升之外,还添加了之前版本没有的功能,如本文所述的原生JSON数据类型功能。
在此版本之前,MySQL所有的JSON数据类型,全部是使用text等文本类型来实现的,数据的处理只能在应用代码级来实现,十分不方便。
什么是JSON类型
作为DBA,可能会对这个概念稍微有点陌生,但是对于开发者来说,这是一个十分熟悉的事物。
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
MySQL原始JSON类型的优势在哪?
原生的JSON优势如下:
- 存储上类似text,可以存非常大的数据。
- 存储在JSON列中的JSON文档的自动验证 。无效的文档会产生错误。
- 优化的存储格式。存储在JSON列中的JSON文档将 转换为内部格式,以允许对文档元素进行快速读取访问。
- 相比于传统形式,不需要遍历所有字符串才能找到数据。
- 支持索引:通过虚拟列的功能可以对JSON中部分的数据进行索引。
MySQL的JSON类型
创建JSON类型表
创建一个基础的员工表,除了工号字段外,还有一个个人基础信息字段和一个个人能力信息字段
MySQL [test]> CREATE TABLE employee (
->
-> `empno` int(10) unsigned NOT NULL AUTO_INCREMENT,
->
-> `basic_info` JSON NOT NULL,
->
-> `skill_info` JSON NOT NULL,
->
-> PRIMARY KEY (`empno`)
->
-> );
Query OK, 0 rows affected (0.02 sec)
表的基础信息,其中JSON类型的字段,是不可以有默认值的,这点需要注意
MySQL [test]> desc employee;
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| empno | int(10) unsigned | NO | PRI | NULL | auto_increment |
| basic_info | json | NO | | NULL | |
| skill_info | json | NO | | NULL | |
+------------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
试着插入几条数据
我们手动插入几条数据进这张表中,在前两条数据中,在个人能力信息上使用的是数组的方式,,后面两条则是使用对象的形式。在MySQL5.7.8版本后的JSON类型中,这两种都是可以的
INSERT INTO `employee` VALUES (1,'{"name": "wangyiyi", "age": "23" ,"from": "hangzhou"}', '["java", "go", "python"]');
INSERT INTO `employee` VALUES (2,'{"name": "linxue", "age": 24 ,"from": "shanghai"}', '["mysql", "oracle", "python"]');
INSERT INTO `employee` VALUES (3,'{"name": "zhaoqing", "age": 24 ,"from": "shanghai"}', '{"system": "linux","database": "mysql", "language": "python"}');
INSERT INTO `employee` VALUES (4,'{"name": "zhouxixi", "age": 30 ,"from": "nanjing"}', '{"system": ["linux","windows"],"database": ["mysql","oracle","postgresql"], "language": ["python","java","go"]}');
插入多个数据后,表中内容为如下
MySQL [test]> select * from employee;
+-------+-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
| empno | basic_info | skill_info |
+-------+-------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
| 1 | {"age": "23", "from": "hangzhou", "name": "wangyiyi"} | ["java", "go", "python"] |
| 2 | {"age": 24, "from": "shanghai", "name": "linxue"} | ["mysql", "oracle", "python"] |
| 3 | {"age": 24,