zoukankan      html  css  js  c++  java
  • MySQL 5.7 深度解析: JSON数据类型使用

    http://www.actionsky.com/docs/archives/156

    JSON (JavaScriptObject Notation) 是一种轻量级的数据交换格式,主要用于传送数据。JSON采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写。对机器来说易于解析和生成,并且会减少网络带宽的传输。由于JSON格式可以解耦javascript客户端应用与Restful服务器端的方法调用,因而在互联网应用中被大量使用。

    JSON的格式非常简单:名称/键值。之前MySQL版本里面要实现这样的存储,要么用VARCHAR要么用TEXT大文本。 MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析。我们先看看MySQL老版本的JSON存取。

    示例表结构:

    CREATE TABLE json_test(
    id INT,
    person_desc TEXT
    )ENGINE INNODB;
    

    我们来插入一条记录:

    INSERT INTO json_test VALUES (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格式的话,只能把这条记录取出来交个应用程序,由应用程序来解析。如此一来,JSON又和特定的应用程序耦合在一起,其便利性的优势大打折扣。

    现在到了MySQL5.7,可以支持对JSON进行属性的解析,我们重新修改下表结构:

    ALTER TABLE json_test MODIFY person_desc json;
    

    先看看插入的这行JSON数据有哪些KEY:

    mysql> SELECT id,json_keys(person_desc) as "keys" FROM json_testG
    *************************** 1. row***************************
        id: 1
    keys: ["authors", "musicians","programmers"]
    1 row in set (0.00 sec)
    

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

    mysql> SELECT json_extract(AUTHORS,'$.lastName[0]') AS 'name', AUTHORS FROM
            -> (
            -> SELECT id,json_extract(person_desc,'$.authors[0][0]') AS "authors" FROM json_test
            ->UNION ALL
            -> SELECT id,json_extract(person_desc,'$.authors[1][0]') AS "authors" FROM json_test
            -> UNION ALL
            -> SELECT id,json_extract(person_desc,'$.authors[2][0]') AS "authors" FROM json_test
            -> ) AS T1
            -> ORDER BY NAME DESCG
    *************************** 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"}
    
    3 rows in set (0.00 sec)
    

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

    mysql> SELECT
            ->json_extract(AUTHORS,'$.firstName[0]') AS "firstname",
            -> json_extract(AUTHORS,'$.lastName[0]')AS "lastname",
            -> json_extract(AUTHORS,'$.genre[0]') AS"genre"
            -> FROM
            -> (
            -> SELECT id,json_extract(person_desc,'$.authors[0]')AS "authors" FROM json
    _test
            -> ) AS TG
    *************************** 1. row***************************
    firstname: "Isaac"
     lastname:"Asimov"
            genre:"sciencefiction"
    1 row in set (0.00 sec)
    

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

    mysql> UPDATE json_test
            -> SET person_desc =json_remove(person_desc,'$.authors')G
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1 Changed: 1  Warnings: 0
    

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

    mysql> SELECT json_contains_path(person_desc,'all','$.authors')as authors_exists FROM json_testG
    *************************** 1. row***************************
    authors_exists: 0
    1 row in set (0.00 sec)
    

    总结下,虽然MySQL5.7开始支持JSON数据类型,但是我建议如果要使用的话,最好是把这样的值取出来,然后在应用程序段来计算。毕竟数据库是用来处理结构化数据的,大量的未预先定义schema的json解析,会拖累数据库的性能。

  • 相关阅读:
    ubuntu12.04 死机 卡屏 画面冻结解决方案
    Install Firefox 20 in Ubuntu 13.04, Ubuntu 12.10, Ubuntu 12.04, Linux Mint 14 and Linux Mint 13 by PPA
    ListView1.SelectedItems.Clear()
    android studio 下载地址
    jquery.slider.js jquery幻灯片测试
    jquery.hovermenu.js
    jquery.tab.js选项卡效果
    适配 placeholder,jquery版
    jquery.autoscroll.js jquery自动滚动效果
    将 Google Earth 地图集成到自己的窗体上的 简单控件
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5679322.html
Copyright © 2011-2022 走看看