zoukankan      html  css  js  c++  java
  • 【mysql】字段支持JSON类型

    mysql从5.7开始已经支持JSON类型的字段。

    支持的操作:添加,修改,置空,子key添加,子key重置,子key删除,通过子key查找等。

    但是这里和普通字段的修改和查找不同,涉及到一些JSON类型特有的函数。

    具体参考:http://www.lnmp.cn/mysql-57-new-features-json.html

    除了文章上面说的那些,还有几个点需要注意:

    1,JSON_CONTAINS函数

    mysql> select * from test_json;
    +----+------------------------------------+---------+
    | id | j                                  | name    |
    +----+------------------------------------+---------+
    |  1 | {"url": "lnmp.cn", "name": "lnmp"} |         |
    |  2 | NULL                               |         |

    执行sql:

    mysql> select * from test_json where JSON_CONTAINS(j,'lnmp', '$.name');
    ERROR 3141 (22032): Invalid JSON text in argument 2 to function json_contains: "Invalid value." at position 0.
    mysql> select * from test_json where JSON_CONTAINS(j,'"lnmp"', '$.name');
    +----+------------------------------------+------+
    | id | j                                  | name |
    +----+------------------------------------+------+
    |  1 | {"url": "lnmp.cn", "name": "lnmp"} |      |
    +----+------------------------------------+------+
    1 row in set (0.00 sec)

    JSON_CONTAINS(field, value, subkey)

    第一个参数是字段名,第二个参数是查找的值,第三个参数是查找的子key。

    这里的value有些限制条件,比如正整数1,需要写成'1';如果是字符串"lnmp",要写成'"lnmp"'。sql才是有效的。

    2,几种不同类型的空数组

    JSON类型的数,可以支持null,{}, [],{'k':'v'},这些类型。

    null:默认值就是null,可以单独设置null;

    {}:空的键值对,可以用cast('{}' as JSON)来设置;

    []:空的数组,可以用cast('[] as JSON')来设置,注意这里并不是集合的概念,里面的值是允许重复的;

    {'k':'v'}:有键值对的数组,可以用cast来设置;

    mysql> select * from test_json;
    +----+------------------------------------+---------+
    | id | j                                  | name    |
    +----+------------------------------------+---------+
    |  1 | {"url": "lnmp.cn", "name": "lnmp"} |         |
    |  2 | NULL                               |         |
    |  3 | {}                                 |         |
    |  4 | NULL                               | brother |
    |  5 | [100, 100, 200]                    | sister  |
    +----+------------------------------------+---------+
    5 rows in set (0.00 sec)

    3,应用中有很多场景,子key不是string,而是int类型,对于这样的场景如何应对的?

    A,添加子key为int类型的数据:

    insert into test_json (j) values(cast('{0:"100",1:"200"}' as JSON));
    ERROR 3141 (22032): Invalid JSON text in argument 1 to function cast_as_json: "Missing a name for object member." at position 1.

    由此可见,直接添加int型的子key是有问题的。

    B,添加子key为string类型,但是值为数字型的数据:

    mysql> insert into test_json (j) values(cast('{"0":"100","1":"200"}' as JSON));
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from test_json;
    +----+------------------------------------+---------+
    | id | j                                  | name    |
    +----+------------------------------------+---------+
    |  1 | {"url": "lnmp.cn", "name": "lnmp"} |         |
    |  2 | NULL                               |         |
    |  3 | {}                                 |         |
    |  4 | NULL                               | brother |
    |  5 | [100, 100, 200]                    | sister  |
    |  6 | {"100": "100", "200": "200"}       |         |
    |  7 | {"0": "100", "1": "200"}           |         |
    +----+------------------------------------+---------+
    7 rows in set (0.00 sec)

    结论:如果要添加数字型的子key,必须包含引号,int型转成string型才可以。

    C,按子key查找条目:

    mysql> select * from test_json where JSON_CONTAINS(j, '"100"', '$."0"');
    +----+--------------------------+------+
    | id | j                        | name |
    +----+--------------------------+------+
    |  7 | {"0": "100", "1": "200"} |      |
    +----+--------------------------+------+
    1 row in set (0.00 sec)

    这里有两个点要注意,1是第二个参数必须是带印号,2是第三个参数的键值名称必须带双引号,而不是之前的'$.name'这样的方式。

    D,select中带有子key:

    mysql> select j->'$."0"' from test_json where id=7;
    +------------+
    | j->'$."0"' |
    +------------+
    | "100"      |
    +------------+
    1 row in set (0.00 sec)

    和C注意的点是一样子的。

  • 相关阅读:
    Frameset 框架
    FHS 文件层次标准
    history 命令
    QT基础走起
    Android中导入jar包v4的错误
    Android工具Eclipse点击卡死或者无响应情况
    让程序飞起来
    Android中报错
    【2019.9.23】NOIP2017 practice exam
    【技巧】时间复杂度
  • 原文地址:https://www.cnblogs.com/helww/p/9330593.html
Copyright © 2011-2022 走看看