zoukankan      html  css  js  c++  java
  • MySQL 5.7 使用原生JSON类型

    首先回顾一下JSON的语法规则:

    数据在键值对中,
    数据由逗号分隔,
    花括号保存对象,
    方括号保存数组。
    

    按照最简单的形式,可以用下面的JSON表示:

    {"NAME": "Brett", "email": "brett@xxx.com"}
    

    如何在MySQL中使用JSON类型:

    新建user表,设置lastlogininfo列为JSON类型。

    mysql> CREATE TABLE user(id INT PRIMARY KEY, name VARCHAR(20) , lastlogininfo JSON);
    Query OK, 0 rows affected (0.27 sec)
    

    向user表插入普通数据与json数据。mysql会对插入的数据进行JSON格式检查,确保其符合JSON格式,若插的是不合法的数据,会出现Invalid JSON text错误。

    mysql> INSERT INTO user VALUES(1 ,"lucy",'{"time":"2015-01-01 13:00:00","ip":"
    192.168.1.1","result":"fail"}');
    Query OK, 1 row affected (0.05 sec)
    
    mysql> INSERT INTO user VALUES(2 ,"bobo",'{"time":"2015-10-07 06:44:00","ip":"
    192.168.1.0","result":"success"}');
    Query OK, 1 row affected (0.04 sec)
    

    也可以使用JSON_OBJECT()函数:

    mysql> INSERT INTO user VALUES(1 ,"lucy",JSON_OBJECT("time",NOW(),"ip","
    192.168.1.1","result","fail"));
    Query OK, 1 row affected (0.00 sec)
    

    查询name为'lucy'的最后登陆信息。

    mysql> SELECT lastlogininfo FROM user WHERE name = 'lucy';
    +------------------------------------------------------------------------+
    | lastlogininfo  |
    +------------------------------------------------------------------------+
    | {"ip": "192.168.1.1", "time": "2015-01-01 13:00:00", "result": "fail"} |
    +------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    查询最后登陆时间在2015-10-02后的用户。JSON数据使用->操作符,其表达式为:该json列->'$.键'与JSON_EXTRACT(json列 , '$.键')等效使用。如果传入的不是一个有效的键,则返回Empty set。该表达式可以用于SELECT查询列表 ,WHERE/HAVING , ORDER/GROUP BY中,但它不能用于设置值。

    表达式 : json列->'$.键'

    mysql>  SELECT * FROM user WHERE lastlogininfo ->'$.time' > '2015-10-02';
    +-----------------------------------------------------------------------+
    | id | name | lastlogininfo|
    +-----------------------------------------------------------------------+
    |  2 | bobo | {"ip": "192.168.1.0", "time": "2015-10-07 06:44:00", "result": "success"} |
    +-----------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    等价于 :JSON_EXTRACT(json列 , '$.键')

    mysql>  SELECT * FROM user WHERE JSON_EXTRACT(lastlogininfo,'$.time') > '2015-10-02';
    +-----------------------------------------------------------------------+
    | id | name | lastlogininfo|
    +-----------------------------------------------------------------------+
    |  2 | bobo | {"ip": "192.168.1.0", "time": "2015-10-07 06:44:00", "result": "success"} |
    +-----------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    比较JSON值采用两个级别。第一级是基于JSON类型的比较。如果类型不同,则取决于哪种类型具有更高的优先级。如果是相同的JSON类型,则是第二级,使用该类型的规则来比较。

    下面的列表显示了JSON类型的比较规则,从最高优先级到最低优先级。显示在一行的类型则是具有相同的优先级。

    BLOB
    BIT
    OPAQUE
    DATETIME
    TIME
    DATE
    BOOLEAN
    ARRAY
    OBJECT
    STRING
    INTEGER, DOUBLE
    NULL
    

    使用JSON_TYPE()函数返回指定属性对应的类型名称:

    mysql> SELECT JSON_TYPE(lastlogininfo->'$.ip') FROM user;
    +----------------------------------+
    | JSON_TYPE(lastlogininfo->'$.ip') |
    +----------------------------------+
    | STRING   |
    | STRING   |
    +----------------------------------+
    2 rows in set (0.00 sec)
    

    值得一提的是,可以通过虚拟列对JSON类型的指定属性进行快速查询。

    创建虚拟列:

    mysql> ALTER TABLE user ADD lastloginresult VARCHAR(15)
        -> GENERATED ALWAYS AS (lastlogininfo->'$.result') VIRTUAL;
    Query OK, 0 rows affected (0.08 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    使用时和普通类型的列查询是一样的:

    mysql> SELECT lastloginresult FROM user WHERE name='lucy';
    +-----------------+
    | lastloginresult |
    +-----------------+
    | "fail"  |
    +-----------------+
    1 row in set (0.00 sec)
    

    这只是一个简单的JSON类型例子,Mysql还提供了许多对JSON类型处理的函数,可以从MySQL的官方网站查看帮助文档:
    http://dev.mysql.com/doc/refman/5.7/en/json.html

  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/jtlgb/p/9176625.html
Copyright © 2011-2022 走看看