作者:朱智武,新炬网络高级技术专家。
笔者经过测试,InnoDB/MyISAM/CSV三个存储引擎支持JSON。
MEMORY存储引擎使用JSON数据类型会报错,错误显示JSON数据类型的实现与BLOB/TEXT有一定关联。
创建包含JSON字段的表
插入包含合法JSON值的一条记录
如果JSON值非法,会报错
使用SELECT语句可以将该JSON值查询出来
JSON值不仅仅可以以字符串表达,还可以通过函数生成,比如JSON_ARRAY()将一系列值组合成一个JSON数组,JSON_OBJECT()将键值对组合成一个JSON对象,JSON_MERGE()将两个或更多的JSON文档进行合并。
JSON的路径表达式选择出JSON文档中的给定值。如以下的例子,我们使用JSON_EXTRACT()函数读取JSON文档键为name的值。
路径表达式以$字符开始,$字符表示该JSON文档,之后是路径选择器,包括点号和[N],其中点号对应JSON对象,而[N]对应JSON数组(数组从0开始编号)。路径表达式中还可以包含*和**匹配符。如果JSON文档中不存在该路径,那么返回值会是NULL。
路径表达式可以内联使用,比如以下的例子。
事实上,data->'$.name'即是json_extract(data,'$.name')的同义语法。如果查看执行计划,上面的SELECT语句走的是全表扫描。
执行以下的SQL语句创建data->'$.name'的生成字段(生成字段,即Generated Column,也是MySQL 5.7的新特性),并创建相应的索引。
再次查看该语句的执行计划,可以使用上索引。
MySQL有一些函数,可以修改JSON文档,并返回修改后的新JSON文档。路径表达式指出文档中的哪部分需要修改。这些函数比如JSON_INSERT()、JSON_REPLACE()、JSON_SET()和JSON_REMOVE()。我们以以下的JSON文档为例。
JSON_INSERT()可以添加新值,但它不会替换已存在的值。
JSON_REPLACE()替换已有的值,但忽略新值,即新值不会添加到文档中。
JSON_SET()替换已有路径的值,添加未有路径的值。
JSON_REMOVE()移除JSON文档中给定的一个或多个路径,如果路径不存在的话,函数会忽略该路径。
MongoDB是主要支持JSON的数据库,而MySQL增加了对流行的JSON的支持,扩展了MySQL的应用领域。到底是使用MySQL+MongoDB更好呢?还是单单使用MySQL更好呢?在不同的场景中可能有不同的答案。此外,很多人将MySQL与PostgreSQL作对比,很多文章列出了PostgreSQL比MySQL强的地方,对JSON的支持是其中一项,现在,MySQL将这弥补上了。
上一篇:MYSQL存储引擎介绍及选择 下一篇:Web前端技术框架介绍