【原创】MySQL5.7 JSON类型使用介绍_PHP教程

php中文网
发布: 2016-07-12 09:05:15
原创
837人浏览过

【原创】mysql5.7 json类型使用介绍

json是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似xml,但是比xml简单,易读并且易编写。对机器来说易于解析和生成,并且会减少网络带宽的传输。
json的格式非常简单:名称/键值。之前mysql版本里面要实现这样的存储,要么用varchar要么用text大文本。 mysql5.7发布后,专门设计了json数据类型以及关于这种类型的检索以及其他函数解析。 我们先看看mysql老版本的json存取。


示例表结构:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>create table json_test(<br /></li><li>id int,<br /></li><li>person_desc text<br /></li><li>)engine innodb;</li></ol>
登录后复制




我们来插入一条记录:


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>insert into json_test values (1,'{<br /></li><li>"programmers": [{<br /></li><li>"firstname": "brett",<br /></li><li>"lastname": "mclaughlin",<br /></li><li>"email": "aaaa"<br /></li><li>}, {<br /></li><li>"firstname": "jason",<br /></li><li>"lastname": "hunter",<br /></li><li>"email": "bbbb"<br /></li><li>}, {<br /></li><li>"firstname": "elliotte",<br /></li><li>"lastname": "harold",<br /></li><li>"email": "cccc"<br /></li><li>}],<br /></li><li>"authors": [{<br /></li><li>"firstname": "isaac",<br /></li><li>"lastname": "asimov",<br /></li><li>"genre": "sciencefiction"<br /></li><li>}, {<br /></li><li>"firstname": "tad",<br /></li><li>"lastname": "williams",<br /></li><li>"genre": "fantasy"<br /></li><li>}, {<br /></li><li>"firstname": "frank",<br /></li><li>"lastname": "peretti",<br /></li><li>"genre": "christianfiction"<br /></li><li>}],<br /></li><li>"musicians": [{<br /></li><li>"firstname": "eric",<br /></li><li>"lastname": "clapton",<br /></li><li>"instrument": "guitar"<br /></li><li>}, {<br /></li><li>"firstname": "sergei",<br /></li><li>"lastname": "rachmaninoff",<br /></li><li>"instrument": "piano"<br /></li><li>}]<br /></li><li>}');</li></ol>
登录后复制



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


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



<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>alter table json_test modify person_desc json;</li></ol>
登录后复制


先看看插入的这行json数据有哪些key:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mysql> select id,json_keys(person_desc) as "keys" from json_test\g<br /></li><li>*************************** 1. row ***************************<br /></li><li>id: 1<br /></li><li>keys: ["authors", "musicians", "programmers"]<br /></li><li>1 row in set (0.00 sec)</li></ol>
登录后复制



Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online

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

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mysql> SELECT json_extract(AUTHORS,'$.lastName[0]') AS 'name', AUTHORS FROM<br /></li><li>-> (<br /></li><li>-> SELECT id,json_extract(person_desc,'$.authors[0][0]') AS "authors" FROM json_test<br /></li><li>-> UNION ALL<br /></li><li>-> SELECT id,json_extract(person_desc,'$.authors[1][0]') AS "authors" FROM json_test<br /></li><li>-> UNION ALL<br /></li><li>-> SELECT id,json_extract(person_desc,'$.authors[2][0]') AS "authors" FROM json_test<br /></li><li>-> ) AS T1<br /></li><li>-> ORDER BY NAME DESC\G<br /></li><li>*************************** 1. row ***************************<br /></li><li>name: "Williams"<br /></li><li>AUTHORS: {"genre": "fantasy", "lastName": "Williams", "firstName": "Tad"}<br /></li><li>*************************** 2. row ***************************<br /></li><li>name: "Peretti"<br /></li><li>AUTHORS: {"genre": "christianfiction", "lastName": "Peretti", "firstName": "Frank"}<br /></li><li>*************************** 3. row ***************************<br /></li><li>name: "Asimov"<br /></li><li>AUTHORS: {"genre": "sciencefiction", "lastName": "Asimov", "firstName": "Isaac"}<br /></li><li><br /></li><li><br /></li><li>3 rows in set (0.00 sec)</li></ol>
登录后复制


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

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mysql> SELECT<br /></li><li>-> json_extract(AUTHORS,'$.firstName[0]') AS "firstname",<br /></li><li>-> json_extract(AUTHORS,'$.lastName[0]') AS "lastname",<br /></li><li>-> json_extract(AUTHORS,'$.genre[0]') AS "genre"<br /></li><li>-> FROM<br /></li><li>-> (<br /></li><li>-> SELECT id,json_extract(person_desc,'$.authors[0]') AS "authors" FROM json<br /></li><li>_test<br /></li><li>-> ) AS T\G<br /></li><li>*************************** 1. row ***************************<br /></li><li>firstname: "Isaac"<br /></li><li>lastname: "Asimov"<br /></li><li>genre: "sciencefiction"<br /></li><li>1 row in set (0.00 sec)</li></ol>
登录后复制


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


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mysql> UPDATE json_test<br /></li><li>-> SET person_desc = json_remove(person_desc,'$.authors')\G<br /></li><li>Query OK, 1 row affected (0.01 sec)<br /></li><li>Rows matched: 1  Changed: 1  Warnings: 0</li></ol>
登录后复制


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

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mysql> SELECT json_contains_path(person_desc,'all','$.authors') as authors_exist<br /></li><li>s FROM json_test\G<br /></li><li>*************************** 1. row ***************************<br /></li><li>authors_exists: 0<br /></li><li>1 row in set (0.00 sec)</li></ol>
登录后复制


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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1069967.htmlTechArticle【原创】MySQL5.7 JSON类型使用介绍 JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编...
相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号