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

最新文章

  1. HTML组成与语法
  2. 1st贝塞尔函数的使用
  3. 十天冲刺---Day1
  4. ASP.net MVC自定义错误处理页面的方法
  5. WebApp远程调试工具
  6. 初涉JavaScript模式 (5) : 原型模式 【一】
  7. __declspec,__cdecl,__stdcall都是什么意思?有什么作用?
  8. The Decoder - UVa458
  9. 使用 Entity Framework Code First
  10. 英文汉语切换的导航栏,纯css制作。
  11. python+selenium运行时,提示元素不可见
  12. win10系统中如何解决cmd中的路径和现在电脑的用户名不一致
  13. cdqz2017-test10-rehearsal(CDQ分治&可持久化线段树&单调栈)
  14. waven 常用构建命令
  15. springmvc处理url请求步骤
  16. Exam E05-001 Information Storage and Management Version 3 Exam
  17. 多线程的学习与GDI的学习
  18. C++的virtual详解
  19. 固态硬盘安装win7系统问题。
  20. chkconfig的原理 和添加开机自启动的办法

热门文章

  1. 学习Java Day6
  2. JZOJ 2022.07.06【提高组A】模拟
  3. 益赛普等TNFi持续治疗强直性脊柱炎的长期疗效观察(≥3年)
  4. Vulnhub:mhz_c1f靶机
  5. Windows 从头搭建c++ Eigen 库
  6. java读取虚拟串口数据
  7. VIT论文笔记
  8. python 读取xls文件
  9. Java面向对象之类与对象的创建
  10. macos 安装多版本PHP,composer