• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL中json字段的操作方法

       MySQL5.7.8中引入了json字段,这种类型的字段使用的频率比较低,但是在实际操作中,有些业务仍然在用,我们以此为例,介绍下json字段的操作方法:

    还是从例子看起:

    mysql> create table test1(id int,info json);
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into test1 values (1,'{"name":"yeyz","age":26}'),(2,'{"name":"zhangsan","age":30}'),(3,'{"name":"lisi","age":35}');
    Query OK, 3 rows affected (0.02 sec)
    Records: 3 Duplicates: 0 Warnings: 0
    
    mysql> select * from test1;
    +------+---------------------------------+
    | id  | info              |
    +------+---------------------------------+
    |  1 | {"age": 26, "name": "yeyz"}   |
    |  2 | {"age": 30, "name": "zhangsan"} |
    |  3 | {"age": 35, "name": "lisi"}   |
    +------+---------------------------------+
    3 rows in set (0.00 sec)

        首先我们创建了一个表test1,其中id是int字段,info是json字段,插入了三条数据,如上:

    mysql> select * from test1 where json_extract(info,"$.age")>=30;
    +------+---------------------------------+
    | id  | info              |
    +------+---------------------------------+
    |  2 | {"age": 30, "name": "zhangsan"} |
    |  3 | {"age": 35, "name": "lisi"}   |
    +------+---------------------------------+
    2 rows in set (0.00 sec)

       我们可以通过json_extract的方法得到json中的内容。其中:

    1、$符号代表的是json的根目录,

    2、我们使用$.age相当于取出来了json中的age字段,

    3、当然,在函数最前面,应该写上字段名字info

    下面来看json中常用的函数:

    a、json_valid判断是否是json字段,如果是,返回1,如果不是,返回0

    mysql> select json_valid(2);
    +---------------+
    | json_valid(2) |
    +---------------+
    |       0 |
    +---------------+
    1 row in set (0.01 sec)
    mysql> select json_valid('{"num":2}');
    +-------------------------+
    | json_valid('{"num":2}') |
    +-------------------------+
    |            1 |
    +-------------------------+
    1 row in set (0.00 sec)
    
    mysql> select json_valid('2');
    +-----------------+
    | json_valid('2') |
    +-----------------+
    |        1 |
    +-----------------+
    1 row in set (0.00 sec)
    mysql> select json_valid('name');
    +--------------------+
    | json_valid('name') |
    +--------------------+
    |         0 |
    +--------------------+
    1 row in set (0.00 sec)

       这里需要注意的是,如果传入了字符串2,那么,返回结果是1

    b、json_keys传回执行json字段最上一层的key值

    mysql> select json_keys('{"name":"yeyz","score":100}');
    +------------------------------------------+
    | json_keys('{"name":"yeyz","score":100}') |
    +------------------------------------------+
    | ["name", "score"]            |
    +------------------------------------------+
    1 row in set (0.01 sec)
    mysql> select json_keys('{"name":"yeyz","score":{"math":100,"English":95}}');
    +----------------------------------------------------------------+
    | json_keys('{"name":"yeyz","score":{"math":100,"English":95}}') |
    +----------------------------------------------------------------+
    | ["name", "score"]                       |
    +----------------------------------------------------------------+
    1 row in set (0.00 sec)
    #如果有多层,可以在最后面使用$的方法,拿到其中的某一层的目录
    mysql> select json_keys('{"name":"yeyz","score":{"math":100,"English":95}}','$.score');
    +--------------------------------------------------------------------------+
    | json_keys('{"name":"yeyz","score":{"math":100,"English":95}}','$.score') |
    +--------------------------------------------------------------------------+
    | ["math", "English"]                           |
    +--------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    c、json_length函数,返回最上一层的key个数,如果想取到中间的某一层,则可以使用$的方法,如下:

    mysql> select json_length('{"name":"yeyz","score":{"math":100,"English":95},"age":26}');
    +---------------------------------------------------------------------------+
    | json_length('{"name":"yeyz","score":{"math":100,"English":95},"age":26}') |
    +---------------------------------------------------------------------------+
    |                                     3 |
    +---------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select json_length('{"name":"yeyz","score":{"math":100,"English":95},"age":26}','$.score');
    +-------------------------------------------------------------------------------------+
    | json_length('{"name":"yeyz","score":{"math":100,"English":95},"age":26}','$.score') |
    +-------------------------------------------------------------------------------------+
    |                                          2 |
    +-------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    d、json_depth函数,json文件的深度,测试例子如下:

    mysql> select json_depth('{"aaa":1}'),json_depth('{}');
    +-------------------------+------------------+
    | json_depth('{"aaa":1}') | json_depth('{}') |
    +-------------------------+------------------+
    |            2 |        1 |
    +-------------------------+------------------+
    1 row in set (0.00 sec)
    
    mysql> select json_depth('{"name":"yeyz","score":{"math":100,"English":95},"age":26}');
    +--------------------------------------------------------------------------+
    | json_depth('{"name":"yeyz","score":{"math":100,"English":95},"age":26}') |
    +--------------------------------------------------------------------------+
    |                                    3 |
    +--------------------------------------------------------------------------+
    1 row in set (0.00 sec)

       这里需要注意的是,形如{'aa':1}这种形式的json,其深度是2

    e、json_contains_path函数检索json中是否有一个或者多个成员。

    mysql> set @j='{"a":1,"b":2,"c":{"d":4}}';
    Query OK, 0 rows affected (0.00 sec)
    #one的意思是只要包含一个成员,就返回1
    mysql> select json_contains_path(@j,'one','$.a','$.e');
    +------------------------------------------+
    | json_contains_path(@j,'one','$.a','$.e') |
    +------------------------------------------+
    |                    1 |
    +------------------------------------------+
    1 row in set (0.00 sec)
    #all的意思是所有的成员都包含,才返回1
    mysql> select json_contains_path(@j,'all','$.a','$.e');
    +------------------------------------------+
    | json_contains_path(@j,'all','$.a','$.e') |
    +------------------------------------------+
    |                    0 |
    +------------------------------------------+
    1 row in set (0.01 sec)
    
    mysql> select json_contains_path(@j,'one','$.c.d');
    +--------------------------------------+
    | json_contains_path(@j,'one','$.c.d') |
    +--------------------------------------+
    |                  1 |
    +--------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select json_contains_path(@j,'one','$.a.d');
    +--------------------------------------+
    | json_contains_path(@j,'one','$.a.d') |
    +--------------------------------------+
    |                  0 |
    +--------------------------------------+
    1 row in set (0.00 sec)

    f、json_type函数,判断json中的成员的类型,需要和json_extract结合起来使用。

    mysql> select * from test1;
    +------+---------------------------------+
    | id  | info              |
    +------+---------------------------------+
    |  1 | {"age": 26, "name": "yeyz"}   |
    |  2 | {"age": 30, "name": "zhangsan"} |
    |  3 | {"age": 35, "name": "lisi"}   |
    +------+---------------------------------+
    3 rows in set (0.00 sec)
    #判断name的类型
    mysql> select json_type(json_extract(info,"$.name")) from test1;
    +----------------------------------------+
    | json_type(json_extract(info,"$.name")) |
    +----------------------------------------+
    | STRING                 |
    | STRING                 |
    | STRING                 |
    +----------------------------------------+
    3 rows in set (0.00 sec)
    #判断age的类型
    mysql> select json_type(json_extract(info,"$.age")) from test1;
    +---------------------------------------+
    | json_type(json_extract(info,"$.age")) |
    +---------------------------------------+
    | INTEGER                |
    | INTEGER                |
    | INTEGER                |
    +---------------------------------------+
    3 rows in set (0.00 sec)
    #判断name和age组合起来的类型,可以看到是array
    mysql> select json_type(json_extract(info,"$.name","$.age")) from test1;
    +------------------------------------------------+
    | json_type(json_extract(info,"$.name","$.age")) |
    +------------------------------------------------+
    | ARRAY                     |
    | ARRAY                     |
    | ARRAY                     |
    +------------------------------------------------+
    3 rows in set (0.00 sec)

    g、*的作用,所有的值,看下面的例子。

    {
     "a":1,
     "b":2,
     "c":
       {
        "d":4
       }
     "e":
       {
       "d":
         {
         "ddd":
         "5"
         }
       }
    }
    mysql> set @j='{"a":1,"b":2,"c":{"d":4},"e":{"d":{"ddd":"5"}}}';
    Query OK, 0 rows affected (0.00 sec)
    #所有成员
    mysql> select json_extract(@j,'$.*');
    +---------------------------------------+
    | json_extract(@j,'$.*')        |
    +---------------------------------------+
    | [1, 2, {"d": 4}, {"d": {"ddd": "5"}}] |
    +---------------------------------------+
    1 row in set (0.00 sec)
    #所有成员中的d成员
    mysql> select json_extract(@j,'$.*.d');
    +--------------------------+
    | json_extract(@j,'$.*.d') |
    +--------------------------+
    | [4, {"ddd": "5"}]    |
    +--------------------------+
    1 row in set (0.00 sec)

    以上就是MySQL中json字段的操作方法的详细内容,更多关于MySQL json字段的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 深入浅出讲解MySQL的并行复制
    • MySQL删除了记录不生效的原因排查
    • MySQL CHAR和VARCHAR存储、读取时的差别
    • MySQL学习教程之聚簇索引
    • 浅谈MySQL大表优化方案
    • MySQL8.0中的降序索引
    • 详解mysql中的存储引擎
    • 记一次MySQL的优化案例
    • mysql 主从复制如何跳过报错
    • 浅析MySQL并行复制
    上一篇:MySQL CHAR和VARCHAR存储、读取时的差别
    下一篇:MySQL删除了记录不生效的原因排查
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL中json字段的操作方法 MySQL,中,json,字段,的,操作,