MySQL5.7 JSON类型使用详解
JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写。对机器来说易于解析和生成,并且会减少网络带宽的传输。
JSON的格式非常简单:名称/键值。之前MySQL版本里面要实现这样的存储,要么用VARCHAR要么用TEXT大文本。MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析。我们先看看MySQL老版本的JSON存取。
示例表结构:
CREATETABLEjson_test( idINT, person_descTEXT )ENGINEINNODB;
我们来插入一条记录:
NSERTINTOjson_testVALUES(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,我们重新修改下表结构:
ALTERTABLEjson_testMODIFYperson_descjson;
先看看插入的这行JSON数据有哪些KEY:
mysql>SELECTid,json_keys(person_desc)as"keys"FROMjson_test\G ***************************1.row*************************** id:1 keys:["authors","musicians","programmers"] rowinset(0.00sec)
我们可以看到,里面有三个KEY,分别为authors,musicians,programmers。那现在找一个KEY把对应的值拿出来:
mysql>SELECTjson_extract(AUTHORS,'$.lastName[0]')AS'name',AUTHORSFROM ->( ->SELECTid,json_extract(person_desc,'$.authors[0][0]')AS"authors"FROMjson_test ->UNIONALL ->SELECTid,json_extract(person_desc,'$.authors[1][0]')AS"authors"FROMjson_test ->UNIONALL ->SELECTid,json_extract(person_desc,'$.authors[2][0]')AS"authors"FROMjson_test ->)AST1 ->ORDERBYNAMEDESC\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"} 3rowsinset(0.00sec)
现在来把详细的值罗列出来:
mysql>SELECT ->json_extract(AUTHORS,'$.firstName[0]')AS"firstname", ->json_extract(AUTHORS,'$.lastName[0]')AS"lastname", ->json_extract(AUTHORS,'$.genre[0]')AS"genre" ->FROM ->( ->SELECTid,json_extract(person_desc,'$.authors[0]')AS"authors"FROMjson _test ->)AST\G ***************************1.row*************************** firstname:"Isaac" lastname:"Asimov" genre:"sciencefiction" rowinset(0.00sec)
我们进一步来演示把authors这个KEY对应的所有对象删掉。
mysql>UPDATEjson_test ->SETperson_desc=json_remove(person_desc,'$.authors')\G QueryOK,1rowaffected(0.01sec) Rowsmatched:1Changed:1Warnings:0
查找下对应的KEY,发现已经被删除掉了。
mysql>SELECTjson_contains_path(person_desc,'all','$.authors')asauthors_exist sFROMjson_test\G ***************************1.row*************************** authors_exists:0 rowinset(0.00sec)
总结下,虽然MySQL5.7开始支持JSON数据类型,但是我建议如果要使用的话,最好是把这样的值取出来,然后在应用程序段来计算,毕竟数据库是用来处理简单数据的。
总结
以上所述是小编给大家介绍的MySQL5.7JSON类型使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!