GVKun编程网logo

mysql有没有json类型?(mysql数据库里面是json 进行查询操作)

24

在这里,我们将给大家分享关于mysql有没有json类型?的知识,让您更了解mysql数据库里面是json进行查询操作的本质,同时也会涉及到如何更有效地JPA映射MySQLjson类型,字符串出现乱码

在这里,我们将给大家分享关于mysql有没有json类型?的知识,让您更了解mysql数据库里面是json 进行查询操作的本质,同时也会涉及到如何更有效地JPA映射MySQL json类型,字符串出现乱码、MybatisPlus如何处理Mysql的json类型、MybatisPlus怎么处理Mysql的json类型、MYSQL 5.7中的本机JSON支持:MYSQL中JSON数据类型的优缺点是什么?的内容。

本文目录一览:

mysql有没有json类型?(mysql数据库里面是json 进行查询操作)

mysql有没有json类型?(mysql数据库里面是json 进行查询操作)

MysqL有json类型。MysqL从5.7版本开始,引入了JSON数据类型,可以直接操作json数据;但MysqL5.7版本以下,在表中保存JSON格式类型的数据,则需要依靠varchar或者text之类的数据类型。

MysqL中的JSON类型

json是一个非常好用的数据类型,在MysqL5.7之前人们都是用string来储存json的,但是这样有个问题就是不能操作json,5.7以后就可以直接操作json数据了。

  1. 创建没什么好说的就是json 不用带长度默认为0
  2. 更新 、和插入可以用string插入
  3. 查询、个人不喜欢把数据交给后台处理,那就交给数据库处理吧例子如下:
  4. 数据库某张表有个content_json字段,里面有这样的数据!
{
  bill: [
    {
      bill: [
        {
          id: C81AEAD03F90000142E81B405F6FADC0,
          uuid: cfd872541b3b4507a50c2b2eda6bef28,
          billid: kjdzyljgmzsfzypj,
          pageno: [],
          billver: V1,
          billname: 新增测试,
          fjNumber: ,
          trueName: ,
          allPageno: [
            {
              top: 13,
              left: 7
            }
          ],
          billValue: {},
          isOtherZL: ,
          billNumber: ,
          fjTMNumber: 
        },
        {
          id: C81AED69D6400001A07818551D9EBEC0,
          uuid: 05d87c8052cd44209c684407d200b7ec,
          billid: opztsfpsgd,
          pageno: [],
          billver: V1,
          billname: 发票申购,
          fjNumber: ,
          trueName: ,
          allPageno: [
            {
              top: 13,
              left: 7
            }
          ],
          isOtherZL: ,
          billNumber: ,
          fjTMNumber: 
        }
      ],
      index: ,
      dependBjBill: {
        formula: ,
        keyview: 
      },
      codeCondition: {
        formula: ,
        keyview: 
      },
      billRuleCondition: {
        formula: ,
        keyview: 
      }
    },
    {
      bill: [
        {
          id: C81AED84903000019B29EAB0196014CE,
          uuid: 0d93fe614d09489cbad8fa5a3d160289,
          billid: kjdzcwgwht,
          pageno: [],
          billver: V1,
          billname: 财务顾,
          fjNumber: ,
          trueName: ,
          allPageno: [
            {
              top: 39,
              left: 7
            }
          ],
          isOtherZL: ,
          billNumber: ,
          fjTMNumber: 
        }
      ],
      index: ,
      dependBjBill: {
        formula: ,
        keyview: 
      },
      codeCondition: {
        formula: ,
        keyview: 
      },
      billRuleCondition: {
        formula: ,
        keyview: 
      }
    }
  ],
  questions: [],
  relyonCondition: {}
}

结构是这样的,我们要查询最底层uuid!按条件查bill下是一个数组 里面的bill还是一个数组那么要查最底层的uuid怎么查呢?

这里写图片描述


个人更喜欢用类似lambda这种方法毕竟这是一个有逼格又好看的操作:

SELECT content_json->'$.bill[*].bill[*].uuid' 
from  b 
WHERE JSON_CONTAINS(content_json->'$.bill[*].bill[*].uuid' ,'[cfd872541b3b4507a50c2b2eda6bef28]')

查询结果

这里写图片描述

代码分析:
content_json->’$.bill[].bill[].uuid’ ;

表示content_json字段
$是必须符号 点代表对象
*代表全部

那么代码意思就是查询content_json字段里面全部bill(第一个)中全部bill(第二个)的uuid组成一个数组返回;
where后面跟着的条件的意思是 存在某个值 这个值可以是一个也可以是多个
JSON_CONTAINS(字段,参数);
字段必须是要查的指定值如 content_json->’$.bill[].bill[].uuid’ ;
参数必须是json类型 string是不行的。

推荐教程:mysql视频教程

JPA映射MySQL json类型,字符串出现乱码

JPA映射MySQL json类型,字符串出现乱码

我正在使用AttributeConverter将MySQL
JSON列转换为Object,如https://stackoverflow.com/a/31547965/1633272所述

将数据存储到MySQL中时,它工作正常,我可以在WorkBench中看到正确的值。

但是,当将该列返回给Java应用程序时,一个Unicode字符映射为3个字符。

这是一个示例,JSON字符串 “中” 只有1个用引号引起来的Unicode字符。在评估表达式窗口中,我可以看到它被映射为

0 = ''"'' 341 = ''ä'' 2282 = ''¸'' 1843 = ''\u00AD'' 1734 = ''"'' 34

我正在使用的库:

''mysql:mysql-connector-java:5.1.39'',''org.springframework.data:spring-data-jpa:1.9.0.RELEASE'',''org.hibernate:hibernate-entitymanager:5.0.6.Final'',

似乎这是MySQL的已知问题:https :
//bugs.mysql.com/bug.php?id=80631

答案1

小编典典

此错误已在mysql-connector-java:5.1.40中修复。

MybatisPlus如何处理Mysql的json类型

MybatisPlus如何处理Mysql的json类型

MybatisPlus处理Mysql的json类型

1、在数据库表定义JSON字段;

2、在实体类加上@TableName(autoResultMap = true)、在JSON字段映射的属性加上@TableField(typeHandler = JacksonTypeHandler.class);

1.实体类中有个属性是其他对象,或者是List;在数据库中存储时使用的是mysql的json格式,此时可以用mybatis plus的一个注解@TableField(typeHandler = JacksonTypeHandler.class)

@TableField(typeHandler = JacksonTypeHandler.class)

这样在存入是就可以把对象自动转换为json格式

2.那么取出时怎么进行映射呢,有分为两种情况

a:当没有使用到xml时:

@Data
@TableName(value = "person",autoResultMap = true)

b:当使用了xml文件时:

<result property="advance" column="advance" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>

MyBatis Plus - xml中如何使用autoResultMap构造的ResultMap

MyBatis Plus有一个很大的缺陷,就是insert和select的时候使用的ResultMap是不同的,修复的办法就是在实体类上增加注解@TableName(autoResultMap = true)。但是这个autoResultMap并不能使用在自定义的方法上,只在MyBatis Plus内置方法上生效。

展示autoResultMap存在的问题

实体类Person

该实体类中有自定义的typehandler: IntegerListTypeHandler, StringListTypeHandler

@TableName(autoResultMap = true)
public class Person {
    private Integer id;
    private String name;
    private Integer age;
    @TableField(typeHandler = IntegerListTypeHandler.class)
    private List<Integer> orgIds;
    @TableField(typeHandler = StringListTypeHandler.class)
    private List<String> hobbies;
}
@Mapper
public interface PersonMapper extends BaseMapper<Person> {
    /**
     * 自定义的根据Id获取Person的方法,与MyBatis-Plus中的selectById相同的功能(但是不能使用autoResultMap生成的ResultMap).
     */
    @Select("SELECT * FROM person WHERE id=#{id}")
    Person selectOneById(int id);
}
  • 自定义方法拿不到一些字段

因为Person中的orgIds和hobbies需要自定义的typeHandler,自定义的方法使用的是resultType=Person,而不是生成的ResultMap,所以都是null

Person person = new Person();
person.setAge(1);
person.setName("tim");
person.setOrgIds(Lists.newArrayList(1,2,3));
person.setHobbies(Lists.newArrayList("basketball", "pingpong"));
personMapper.insert(person);
# 可以得到正确的字段值
Person personInDb = personMapper.selectById(person.getId());
# orgIds和hobbies都为null
personInDb = personMapper.selectOneById(person.getId());
Preconditions.checkArgument(personInDb.getHobbies().equals(person.getHobbies()));
Preconditions.checkArgument(personInDb.getName().equals(person.getName()));
Preconditions.checkArgument(personInDb.getAge().equals(person.getAge()));
Preconditions.checkArgument(personInDb.getOrgIds().equals(person.getOrgIds()));

改进

设置@ResultMap(“mybatis-plus_Person”)

/**
 * 设置了ResultMap为`mybatis-plus_Person`后就可以拿到正确的值.
 */
@ResultMap("mybatis-plus_Person")
@Select("SELECT * FROM person WHERE id=#{id}")
Person selectOneById(int id);

命名规则就是:mybatis-plus_{实体类名}

  • 个人理解

MyBatis Plus本身并不是一个动态的ORM,而只是在mybatis初始化的时候,为mybatis提供常用的SQL语句,resultMap设置,并不会改变MyBatis本身的行为

  • 常见问题

@TableField(typeHandler = IntegerListTypeHandler.class)没有生效:自定义的方法上没有配置resultType

MyBatis-Plus - JacksonTypeHandler VS FastjsonTypeHandler

JacksonTypeHandler

  • 支持 MVC JSON 解析
  • 支持 MySQL JSON 解析

传统的方法是通过 XML SQL 的 resultMap 来做 typeHandler 映射处理,但是这样会影响 MP 的功能,所以 JacksonTypeHandler 正好可以兼容 MP 的功能和满足 支持 MySQL JSON 解析。

FastjsonTypeHandler

  • 支持 MVC JSON 解析
  • 不支持 MySQL JSON 解析

可以通过 XML 支持,只是会失去 MP 特性。

<resultMap id="rxApiVO" type="RxApiVO" >
    <result column="api_dataway" property="apiDataway" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" />
</resultMap>

注意事项:

MVC JSON 解析时,可以不用加 @TableName(value = “t_test”, autoResultMap = true) 【高亮部分】,但是 MySQL JSON 解析查询的时候,如果不加,查出来为 null

MySQL JSON 解析查询时,只支持JSON格式:{“name”:“Tom”,“age”:12},不支持:{“name”:“Tom”,“age”:12} 和 “{“name”:“Tom”,“age”:12}”

MybatisPlus读写Mysql的json字段

前置条件

确保mysql的版本是5.7+

一、新建mysql表增加json字段

在这里插入图片描述

二、pojo类

package com.cxstar.domain;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import java.io.Serializable;
import java.util.Date;
@lombok.Data
@TableName(autoResultMap = true)
public class Data implements Serializable {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;       
	
	// 部分字段省略-------------
    private String title;       
    private String author;         
    private String publisher; 
    // -----------------------   
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private JSONObject aggJson;
}

三、测试类

package com.cxstar;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cxstar.domain.Data;
import com.cxstar.domain.SearchMsg;
import com.cxstar.mapper.DataMapper;
import com.cxstar.service.OrderService;
import com.cxstar.service.spider.impl.*;
import com.cxstar.service.utils.ExecutorThread;
import com.cxstar.service.utils.SpiderThread;
import com.cxstar.service.utils.SynContainer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;
@SpringBootTest
class OrderApplicationTests {
    @Autowired
    DataMapper dataMapper;
    @Test
    void testJson() {
		// insert -----------------------------------
        Data data = new Data();
        data.setTitle("计算机安全技术与方法");
        data.setPublisher("<<计算机技术>>编辑部出版");
        JSONObject jb = new JSONObject();
        jb.put("searchKey", "英格");
        jb.put("curPage", "1");
        JSONArray js = new JSONArray();
        js.add("西北政法大学");
        js.add("西安理工大学");
        jb.put("source", js);
        data.setAggJson(jb);
        dataMapper.insert(data);
        // ------------------------------------------
        // select --------------------------------------
        Data data1 = dataMapper.selectById(5837);
        JSONObject jb2 = data1.getAggJson();
        System.out.println(jb2.getJSONArray("source"));
        // ---------------------------------------------
		
		// group by -----------------------------------------------
		LambdaQueryWrapper<Data> lqw = new LambdaQueryWrapper<>();
        lqw.select(Data::getAggJson);
        lqw.groupBy(Data::getAggJson);
        List<Data> dataList = dataMapper.selectList(lqw);
        System.out.println(dataList);
        // --------------------------------------------------------
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

您可能感兴趣的文章:
  • Mybatis-Plus读写Mysql的Json字段的操作代码
  • mybatis plus实体类中字段映射mysql中的json格式方式
  • Mysql json类型字段Java+Mybatis数据字典功能的实践方式

MybatisPlus怎么处理Mysql的json类型

MybatisPlus怎么处理Mysql的json类型

MybatisPlus处理Mysql的json类型

1、在数据库表定义json字段;2、在实体类加上@TableName(autoResultMap = true)、在JSON字段映射的属性加上@TableField(typeHandler = JacksonTypeHandler.class);

1.实体类中有个属性是其他对象,或者是List;在数据库中存储时使用的是mysql的json格式,此时可以用mybatis plus的一个注解@TableField(typeHandler = JacksonTypeHandler.class)

@TableField(typeHandler = JacksonTypeHandler.class)
登录后复制

这样在存入是就可以把对象自动转换为json格式

2.那么取出时怎么进行映射呢,有分为两种情况

a:当没有使用到xml时:

@Data
@TableName(value = "person",autoResultMap = true)
登录后复制

b:当使用了xml文件时:

<result property="advance" column="advance" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
登录后复制

MyBatis Plus - xml中如何使用autoResultMap构造的ResultMap

MyBatis Plus有一个很大的缺陷,就是insert和select的时候使用的ResultMap是不同的,修复的办法就是在实体类上增加注解@TableName(autoResultMap = true)。但是这个autoResultMap并不能使用在自定义的方法上,只在MyBatis Plus内置方法上生效。

展示autoResultMap存在的问题

实体类Person

该实体类中有自定义的typehandler: IntegerListTypeHandler, StringListTypeHandler

@TableName(autoResultMap = true)
public class Person {
    private Integer id;
    private String name;
    private Integer age;
    @TableField(typeHandler = IntegerListTypeHandler.class)
    private List<Integer> orgIds;
    @TableField(typeHandler = StringListTypeHandler.class)
    private List<String> hobbies;
}
登录后复制
@Mapper
public interface PersonMapper extends BaseMapper<Person> {
    /**
     * 自定义的根据Id获取Person的方法,与MyBatis-Plus中的selectById相同的功能(但是不能使用autoResultMap生成的ResultMap).
     */
    @Select("SELECT * FROM person WHERE id=#{id}")
    Person selectOneById(int id);
}
登录后复制
  • 自定义方法拿不到一些字段

因为Person中的orgIds和hobbies需要自定义的typeHandler,自定义的方法使用的是resultType=Person,而不是生成的ResultMap,所以都是null

Person person = new Person();
person.setAge(1);
person.setName("tim");
person.setOrgIds(Lists.newArrayList(1,2,3));
person.setHobbies(Lists.newArrayList("basketball", "pingpong"));
personMapper.insert(person);
# 可以得到正确的字段值
Person personInDb = personMapper.selectById(person.getId());
# orgIds和hobbies都为null
personInDb = personMapper.selectOneById(person.getId());
Preconditions.checkArgument(personInDb.getHobbies().equals(person.getHobbies()));
Preconditions.checkArgument(personInDb.getName().equals(person.getName()));
Preconditions.checkArgument(personInDb.getAge().equals(person.getAge()));
Preconditions.checkArgument(personInDb.getOrgIds().equals(person.getOrgIds()));
登录后复制

改进

设置@ResultMap(“mybatis-plus_Person”)

/**
 * 设置了ResultMap为`mybatis-plus_Person`后就可以拿到正确的值.
 */
@ResultMap("mybatis-plus_Person")
@Select("SELECT * FROM person WHERE id=#{id}")
Person selectOneById(int id);
登录后复制

命名规则就是:mybatis-plus_{实体类名}

  • 个人理解

MyBatis Plus本身并不是一个动态的ORM,而只是在mybatis初始化的时候,为mybatis提供常用的SQL语句,resultMap设置,并不会改变MyBatis本身的行为

  • 常见问题

@TableField(typeHandler = IntegerListTypeHandler.class)没有生效:自定义的方法上没有配置resultType

MyBatis-Plus - JacksonTypeHandler VS FastjsonTypeHandler

JacksonTypeHandler

  • 支持 MVC JSON 解析

  • 支持 MySQL JSON 解析

传统的方法是通过 XML SQL 的 resultMap 来做 typeHandler 映射处理,但是这样会影响 MP 的功能,所以 JacksonTypeHandler 正好可以兼容 MP 的功能和满足 支持 MySQL JSON 解析。

FastjsonTypeHandler

  • 支持 MVC JSON 解析

  • 不支持 MySQL JSON 解析

可以通过 XML 支持,只是会失去 MP 特性。

<resultMap id="rxApiVO" type="RxApiVO" >
    <result column="api_dataway" property="apiDataway" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler" />
</resultMap>
登录后复制

注意事项:

MVC JSON 解析时,可以不用加 @TableName(value = “t_test”, autoResultMap = true) 【高亮部分】,但是 MySQL JSON 解析查询的时候,如果不加,查出来为 null

MySQL JSON 解析查询时,只支持JSON格式:{“name”:“Tom”,“age”:12},不支持:{“name”:“Tom”,“age”:12} 和 “{“name”:“Tom”,“age”:12}”

MybatisPlus读写Mysql的json字段

前置条件

确保mysql的版本是5.7+

一、新建mysql表增加json字段

MybatisPlus怎么处理Mysql的json类型

二、pojo类

package com.cxstar.domain;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import java.io.Serializable;
import java.util.Date;
@lombok.Data
@TableName(autoResultMap = true)
public class Data implements Serializable {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;       
	
	// 部分字段省略-------------
    private String title;       
    private String author;         
    private String publisher; 
    // -----------------------   
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private JSONObject aggJson;
}
登录后复制

三、测试类

package com.cxstar;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cxstar.domain.Data;
import com.cxstar.domain.SearchMsg;
import com.cxstar.mapper.DataMapper;
import com.cxstar.service.OrderService;
import com.cxstar.service.spider.impl.*;
import com.cxstar.service.utils.ExecutorThread;
import com.cxstar.service.utils.SpiderThread;
import com.cxstar.service.utils.SynContainer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;
@SpringBootTest
class OrderApplicationTests {
    @Autowired
    DataMapper dataMapper;
    @Test
    void testJson() {
		// insert -----------------------------------
        Data data = new Data();
        data.setTitle("计算机安全技术与方法");
        data.setPublisher("<<计算机技术>>编辑部出版");
        JSONObject jb = new JSONObject();
        jb.put("searchKey", "英格");
        jb.put("curPage", "1");
        JSONArray js = new JSONArray();
        js.add("西北政法大学");
        js.add("西安理工大学");
        jb.put("source", js);
        data.setAggJson(jb);
        dataMapper.insert(data);
        // ------------------------------------------
        // select --------------------------------------
        Data data1 = dataMapper.selectById(5837);
        JSONObject jb2 = data1.getAggJson();
        System.out.println(jb2.getJSONArray("source"));
        // ---------------------------------------------
		
		// group by -----------------------------------------------
		LambdaQueryWrapper<Data> lqw = new LambdaQueryWrapper<>();
        lqw.select(Data::getAggJson);
        lqw.groupBy(Data::getAggJson);
        List<Data> dataList = dataMapper.selectList(lqw);
        System.out.println(dataList);
        // --------------------------------------------------------
    }
}
登录后复制

以上就是MybatisPlus怎么处理Mysql的json类型的详细内容,更多请关注php中文网其它相关文章!

MYSQL 5.7中的本机JSON支持:MYSQL中JSON数据类型的优缺点是什么?

MYSQL 5.7中的本机JSON支持:MYSQL中JSON数据类型的优缺点是什么?

在MySQL
5.7中,添加了用于在JSON表中存储JSON数据的新数据类型。显然,这将是MySQL的巨大变化。他们列出了一些好处

文档验证 -JSON列中只能存储有效的JSON文档,因此您可以自动验证数据。

有效访问
-更重要的是,当您将JSON文档存储在JSON列中时,它不会存储为纯文本值。相反,它以优化的二进制格式存储,从而可以更快地访问对象成员和数组元素。

性能 -通过在JSON列中的值上创建索引来提高查询性能。这可以通过虚拟列上的“功能索引”来实现。

便利性 -JSON列的附加内联语法使在SQL中集成文档查询变得非常自然。例如(features.feature是一个JSON列):SELECTfeature->"$.properties.STREET" AS property_street FROM features WHERE id =121254;

哇 !它们包括一些很棒的功能。现在,更容易操作数据。现在可以在列中存储更复杂的数据。因此,MySQL现在具有NoSQL的味道。

现在我可以想象对JSON数据的查询类似

SELECT * FROM t1WHERE JSON_EXTRACT(data,"$.series") IN ( SELECT JSON_EXTRACT(data,"$.inverted") FROM t1 | {"series": 3, "inverted": 8} WHERE JSON_EXTRACT(data,"$.inverted")<4 );

那我可以在几个json列中存储巨大的小关系吗?好吗?它破坏规范化了吗? 如果可能的话,我想它将像MySQL列中的NoSQL一样
。我真的很想了解更多有关此功能的信息。MySQL JSON数据类型的优缺点。

答案1

小编典典
SELECT * FROM t1WHERE JSON_EXTRACT(data,"$.series") IN ...

在这样的表达式或函数中使用列会浪费使用索引来帮助优化查询的任何机会。上面显示的查询被强制执行表扫描。

关于“有效访问”的说法具有误导性。这意味着在查询检查了带有JSON文档的行之后,它可以提取一个字段,而不必解析JSON语法的文本。但是仍然需要进行表格扫描来搜索行。换句话说,查询必须检查每一行。

以此类推,如果我在电话簿中搜索名字为“比尔”的人,即使我的名字被突出显示以使其更快地发现它们,我仍然必须阅读电话簿中的每一页。

MySQL 5.7允许您在表中定义虚拟列,然后在虚拟列上创建索引。

ALTER TABLE t1  ADD COLUMN series AS (JSON_EXTRACT(data, ''$.series'')),  ADD INDEX (series);

然后,如果您查询虚拟列,它可以使用索引并避免进行表扫描。

SELECT * FROM t1WHERE series IN ...

很好,但是有点遗漏了使用JSON的意义。使用JSON的吸引力在于,它允许您添加新属性,而无需执行ALTER
TABLE。但是事实证明,如果要在索引的帮助下搜索JSON字段,则无论如何都必须定义一个额外的(虚拟)列。

但是,您不必为JSON文档中的 每个
字段定义虚拟列和索引,而只需定义要搜索或排序的列和索引。JSON中可能还有其他属性,您只需要将它们提取到选择列表中,如下所示:

SELECT JSON_EXTRACT(data, ''$.series'') AS series FROM t1WHERE <other conditions>

我通常会说这是在MySQL中使用JSON的最佳方法。仅在选择列表中。

当您在其他子句(JOIN,WHERE,GROUP BY,HAVING,ORDER BY)中引用列时,使用常规列而不是JSON文档中的字段会更有效。

我在2018年4月的Percona Live会议上发表了名为“
如何在MySQL错误中使用JSON的JSON”的演讲。我将在秋季在Oracle Code One上更新并重复该演讲。

JSON还有其他问题。例如,在我的测试中,JSON文档所需的存储空间是存储相同数据的常规列的2-3倍。

MySQL正在积极地推广其新的JSON功能,主要目的是劝说人们不要迁移到MongoDB。但是像MongoDB这样的面向文档的数据存储从根本上讲是一种非关系式的数据组织方式。它不同于关系型。我并不是说一个比另一个更好,这只是一种不同的技术,适用于不同类型的查询。

当JSON使查询更高效时,您应该选择使用JSON。

不要仅仅因为一项新技术或为了时尚而选择一项技术。


编辑:如果您的WHERE子句使用与虚拟列的定义完全相同的表达式,则MySQL中的虚拟列实现应该使用索引。也就是说,以下内容
使用虚拟列上的索引,因为虚拟列已定义AS (JSON_EXTRACT(data,"$.series"))

SELECT * FROM t1WHERE JSON_EXTRACT(data,"$.series") IN ...

除非通过测试此功能发现,否则如果表达式是JSON提取函数,由于某种原因它将不起作用。它适用于其他类型的表达式,但不适用于JSON函数。

关于mysql有没有json类型?mysql数据库里面是json 进行查询操作的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于JPA映射MySQL json类型,字符串出现乱码、MybatisPlus如何处理Mysql的json类型、MybatisPlus怎么处理Mysql的json类型、MYSQL 5.7中的本机JSON支持:MYSQL中JSON数据类型的优缺点是什么?的相关信息,请在本站寻找。

本文标签: