MySQL的 json 数据类型

MySQL5.7 后的版本,添加了对于 json 类型的支持。此前,json 类型的数据,只能在代码层面做 json.loads()json.dumps() 操作。因此无法直接对 json 内的数据进行查询操作。所有的处理都需要将查询结果转换后再操作,非常的麻烦。

创建表

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(0) NOT NULL AUTO_INCREMENT COMMENT '表的id',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名字',
`age` int(0) UNSIGNED NOT NULL COMMENT '年龄',
`info` json NULL COMMENT '其他信息',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

添加数据

添加数据时,首先要理解 mysql 对 json 的本质操作,其本质还是对支付串的操作,只是当字符串被定义为 JSON时,会在内部对数据再进行一些索引的创建,以方便后续的操作而已。,因此, JSON 需要用引号引起来。

INSERT INTO student (name,age,info) VALUES ("张山",28,'{"sex":"man","school":"清华","score":[88,92,100]}');

查询数据

-- 使用 -> 作为 json 的操作方法时,json 的返回结果会包含引号。
select name, info -> "$.sex" from student; -- 使用 ->> 作为 json 的操作方法时,可以直接把 json 返回结果的引号去掉。
select name, info ->> "$.sex" from student;
select name, info -> "$.score" from student;
select name, info ->> "$.score" as score from student; select name, info -> "$.name" from student;

条件查询

写查询语句时,可以直接按二级目录查询,如下:

select * from student where info -> "$.sex"="man";

修改数据

修改 json中的某个字段时

update student set info=JSON_SET(info,"$.sex","woman") where id=3

在 json 中插入某个字段

update student set info=JSON_INSERT(info,"$.addr","上海") where id=3;

mysql 中引号的使用

  • 单引号:

    只用来限定字符串,数值类型是不需要加引号的。不管使用何种形式的支付串,值都必须包含在引号里(最好是单引号)
  • 双引号:

    标准的 SQL 中是不包含双引号的,往往是数据库本身对于 SQL 的扩展,在mysql中,单引号和双引号的效果是等价的。

go 语言操作 json

type User struct {
ID uint
Name string
Age int
Profile Profile `gorm:"column:info"`
}
type Profile struct {
Sex string
Addr string
Score []int
School string
} func (User) TableName() string {
return "student"
} // Scan 实现 sql.Scanner 接口,从数据库中读值
func (p *Profile) Scan(value any) error {
bytes, ok := value.([]byte)
if !ok {
return errors.New(fmt.Sprintf("failed to unmarshal JSONB value %v", value))
}
return json.Unmarshal(bytes, p)
} // Value 实现 driver.Valuer 接口,Value 返回 json value
func (p Profile) Value() (driver.Value, error) {
return json.Marshal(p)
} func main() {
dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
var user User
err = db.First(&user).Error
if err != nil {
panic(err)
}
fmt.Println(user)
}

参考文献

https://segmentfault.com/a/1190000024445924

mysql 的 json 类型的更多相关文章

  1. MySQL对JSON类型UTF-8编码导致中文乱码探讨

    前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中 ...

  2. MySQL 根据JSON类型的字段进行过滤数据的方式

    第一种方式:JSON_CONTAINS 函数 : 执行相等形式的比较 注意:值的类型一定要相同,不然会报错 文档地址:https://dev.mysql.com/doc/refman/8.0/en/j ...

  3. Mybatis和Mysql的Json类型

    Mysql5.7新增加了Json类型字段,但是目前Mybatis中并不支持 1.新建MybatisJsonTypeHandler.java import com.fasterxml.jackson.a ...

  4. MySQL中的JSON类型

    前言(废话) 昨天抽了点时间在网上搜列了一个开源项目,项目挺完整的,前后台分离还带有微信小程序,我Clone下代码,经过一番倒腾,嘿~还真就跑起来了.在这个过程中,体验了一把VUE项目工程细节,因为之 ...

  5. mysql 5.7 laravel json类型数据相关操作

    2018年10月16日18:14:21 官方文档中文翻译版 原文:https://dev.mysql.com/doc/refman/5.7/en/json.html 最后有部分实例和一个小总结 11. ...

  6. MySQL 5.7 使用原生JSON类型

    首先回顾一下JSON的语法规则: 数据在键值对中, 数据由逗号分隔, 花括号保存对象, 方括号保存数组. 按照最简单的形式,可以用下面的JSON表示: {"NAME": " ...

  7. 【mysql】字段支持JSON类型

    mysql从5.7开始已经支持JSON类型的字段. 支持的操作:添加,修改,置空,子key添加,子key重置,子key删除,通过子key查找等. 但是这里和普通字段的修改和查找不同,涉及到一些JSON ...

  8. 使用mysql innodb 使用5.7的json类型遇到的坑和解决办法

    ---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建 ...

  9. MySQL JSON 类型数据操作

    1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...

  10. mysql中生成列与JSON类型的索引

    MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的. 一个简单的例子来认识生成列! CREATE TABLE triangle( sidea DOUBLE, sideb DOUBLE, ...

随机推荐

  1. Archiver Appliance bug report(问题已解决,见文末)

    本来想发到EPICS mailist里问的,可是发了两次给弹回来,不方便的等不及了,就在这问吧,谁知道怎么解决麻烦一定指导一下. ########################## Hi ALL: ...

  2. dotnet 缓存

    Net 内置内存缓存 asp.net 中是有缓存的实现:HttpContext.Cache,缓存的数据是放到 Web 服务器的进程 内存里. 在控制台.WinForm.子线程.SignalR 等不支持 ...

  3. 进程间通信 —— 管道(Interprocess Communications —— Pipes)

    进程间通信 -- 管道(Interprocess Communications -- Pipes) 管道分为匿名管道(anonymous pipes)和命名管道(named pipes.)两类, 其中 ...

  4. 益赛普等TNFi持续治疗强直性脊柱炎的长期疗效观察(≥3年)

    北大深圳医院风湿免疫科在2021年发表了益赛普等TNFi持续治疗强直性脊柱炎的长期(≥3年)疗效观察[1]. 入排条件严苛,坚持随访不容易 观察对象是2009-2019年间就诊于该科室的AS患者,需有 ...

  5. LeetCode-689 三个无重叠子数组的最大和

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-sum-of-3-non-overlapping-subarrays 题目描述 ...

  6. curl命令查用操作

    curl -o /dev/null -s -w "http_code: %{http_code} http_connect:%{http_connect} content_type:%{co ...

  7. File类-绝对路径 相对路径

    绝对路径:通过给定的路径能够直接在我的电脑中找到的文件 相对路径:文件相对于应用程序的路径 结论: 我们在开发中要尽量使用相对路径 File方法只能读取小文件,是一下子全读出来.如果读大文件则使用文件 ...

  8. vmware网络连接

    vmware提供桥接模式网络连接.网络地址转换 (NAT).仅主机模式网络连接和自定义网络连接选项,用于为虚拟机配置虚拟网络连接.在安装 vmware 时,已在主机系统中安装用于所有网络连接配置的软件 ...

  9. Python 20个常用库

    Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都应该有它. Scrapy.如果你从事爬虫相关的工作,那么这个库也是必不可少的.用过它之后你就不会再想用别的 ...

  10. git常规操作

    git拉代码 使用git clone命令从仓库下载代码,代码下载到了本地:git clone 链接 如果仓库代码又了更新,这时可以使用git pull命令将更新下载到本地 在对本地代码就行修改后,可以 ...