mysql 的 json 类型
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 类型的更多相关文章
- MySQL对JSON类型UTF-8编码导致中文乱码探讨
前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中 ...
- MySQL 根据JSON类型的字段进行过滤数据的方式
第一种方式:JSON_CONTAINS 函数 : 执行相等形式的比较 注意:值的类型一定要相同,不然会报错 文档地址:https://dev.mysql.com/doc/refman/8.0/en/j ...
- Mybatis和Mysql的Json类型
Mysql5.7新增加了Json类型字段,但是目前Mybatis中并不支持 1.新建MybatisJsonTypeHandler.java import com.fasterxml.jackson.a ...
- MySQL中的JSON类型
前言(废话) 昨天抽了点时间在网上搜列了一个开源项目,项目挺完整的,前后台分离还带有微信小程序,我Clone下代码,经过一番倒腾,嘿~还真就跑起来了.在这个过程中,体验了一把VUE项目工程细节,因为之 ...
- mysql 5.7 laravel json类型数据相关操作
2018年10月16日18:14:21 官方文档中文翻译版 原文:https://dev.mysql.com/doc/refman/5.7/en/json.html 最后有部分实例和一个小总结 11. ...
- MySQL 5.7 使用原生JSON类型
首先回顾一下JSON的语法规则: 数据在键值对中, 数据由逗号分隔, 花括号保存对象, 方括号保存数组. 按照最简单的形式,可以用下面的JSON表示: {"NAME": " ...
- 【mysql】字段支持JSON类型
mysql从5.7开始已经支持JSON类型的字段. 支持的操作:添加,修改,置空,子key添加,子key重置,子key删除,通过子key查找等. 但是这里和普通字段的修改和查找不同,涉及到一些JSON ...
- 使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建 ...
- MySQL JSON 类型数据操作
1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...
- mysql中生成列与JSON类型的索引
MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的. 一个简单的例子来认识生成列! CREATE TABLE triangle( sidea DOUBLE, sideb DOUBLE, ...
随机推荐
- 注释、input()、运算符、组织结构(顺序、选择、循环)
注释 单行注释 # 多行注释 将三对引号之间的为多行注释 ''' ''' 中文编码的声明注释 #coding:gbk input()函数 接受来自用户的输入 返回值是str 值的存储 使用=对输入的值 ...
- EPICS Archiver Appliance 单点极限储存速率测试
https://blog.csdn.net/weixin_43767046/article/details/113748775 这个测试一直在进行,虽然因为摸数据库设置而重启过并清过库,但读示波器波形 ...
- python 中常用可视化工具库
python 中常用可视化工具库 a.Numpy常用属性及方法 为什么用它:它可以方便的使用数组,矩阵进行计算,包含线性代数.傅里叶变换.随机数生成等大量函数(处理数值型的数组) import num ...
- CF825F - String Compression
题意:压缩字符串,把字符串分成若干个子串,每个子串可以被压缩成"循环次数 \(+\) 循环节"的形式,求最小长度. dp 求 lcp 先 \(O(n^2)\) dp 求出所有后缀对 ...
- VueTSX 动态使用 element-plus 图标
写 TSX 的目的 element-plus 图标集有很多,但有时需要动态使用某个图标,把所有可能用到的图标都列举出来,通过 v-if 在组件中决定到底渲染哪一个,很费时. .vue 单文件组件中做不 ...
- 集成RocketChat至现有的.Net项目中,为ChatGPT铺路
@ 目录 前言 项目搭建 后端 前端 代理账号 鉴权方式介绍 登录校验模块 前端鉴权方式 后端鉴权方式 登录委托 使用登录委托 处理聊天消息 前端鉴权方式 后端校验方式 项目地址 前言 今天我们来聊一 ...
- .Net DI(Dependency Injection)依赖注入机制
1.简介 DI:Dependency Injection,即依赖注入,他是IOC的具体实现. 在DI中,底层服务对象不再负责依赖关系的创建,而是交由顶端调用进行管理注入 好处:降低组件之间的耦合度,使 ...
- 银河麒麟V10安装MySQL5.7
环境: Kylin-Server-10-SP2-Release-Build09-20210524-x86_64.isomysql-5.7.28-linux-glibc2.12-x86_64.tar ...
- 前端JavaScript深拷贝的三种方法,看了不后悔!!!
深拷⻉ 深拷⻉开辟⼀个新的栈,两个对象属完成相同,但是对应两个不同的地址,修改⼀个对象的属性,不会 改变另⼀个对象的属性 常⻅的深拷⻉⽅式有: _.cloneDeep() jQuery.extend( ...
- s-hr实现单点登录,看我这份笔记就够了!!!
https://pan.kingdee.com/s/MTA5ODk4NyxjNzk1来自:云之家企业云盘