MySQL中json字段的操作方法

 更新时间:2020年11月06日 09:56:00   作者:AsiaYe  
这篇文章主要介绍了MySQL中json字段的操作方法,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下

   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安装配置方法图文教程(CentOS7)

    mysql安装配置方法图文教程(CentOS7)

    这篇文章主要为大家详细介绍了centos7下mysql安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • MySQL数据库迁移全过程

    MySQL数据库迁移全过程

    本文详细解析了MySQL数据库迁移的整个过程,包括准备工作、迁移方法、注意事项和优缺点,文章介绍了三种常见的迁移方法:使用mysqldump导出和导入、使用ibd文件迁移和使用目录整体迁移,每种方法都有其优缺点,选择合适的方法取决于具体的迁移需求和环境
    2025-02-02
  • 有效查询MySQL表中重复数据的方法和技巧分享

    有效查询MySQL表中重复数据的方法和技巧分享

    在MySQL数据库中,偶尔会遇到需要查找表中出现的重复数据的情况,这种情况下,我们可以通过编写一些SQL查询语句轻松地找到并处理这些重复行,本文将介绍一些常见的方法和技巧,帮助你有效地查询MySQL表中的重复数据,需要的朋友可以参考下
    2023-10-10
  • 修改MySQL所有表的编码或修改某个字段的编码步骤详解

    修改MySQL所有表的编码或修改某个字段的编码步骤详解

    这篇文章主要给大家介绍了关于修改MySQL所有表的编码或修改某个字段编码的相关资料,在进行数据库编码更改之前,需要先确定目标编码格式,常见的编码格式有UTF-8、GBK等,需要的朋友可以参考下
    2023-12-12
  • Mysql索引常见问题汇总

    Mysql索引常见问题汇总

    这篇文章主要介绍了Mysql索引常见问题汇总,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-10-10
  • Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止。

    Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止。

    初学php接触mysql,遇到一些问题,卸载重装后,无法启动mysql服务,网络上有很多种说法,我这里将我解决这个问题的办法提出
    2009-12-12
  • MySQL 请选择合适的列

    MySQL 请选择合适的列

    如果你的表结构设计不良或你的索引设计不佳,那么请你优化你的表结构设计和给予合适的索引,这样你的查询性能就能提高几个数量级。——数据越大,索引的价值越能体现出来
    2012-05-05
  • Windows7 64位安装最新版本MySQL服务器的图文教程

    Windows7 64位安装最新版本MySQL服务器的图文教程

    本文通过图文并茂的形式给大家介绍了Windows7 64位安装最新版本MySQL服务器的教程,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-06-06
  • MySQL 百万级数据的4种查询优化方式

    MySQL 百万级数据的4种查询优化方式

    本文讲解了MySQL 百万级数据的4种查询优化方式,大家可以根据自身需求,选择适合自己的优化方式
    2021-06-06
  • MySQL中如何重建表

    MySQL中如何重建表

    这篇文章主要介绍了MySQL中如何重建表问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论