详解mysql bit/json/enum/set 的数据存储

 更新时间:2023年09月04日 10:03:30   作者:教练、我想打篮球  
这篇文章主要介绍了mysql bit/json/enum/set 的数据存储,探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储,需要的朋友可以参考下

前言

这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 

探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 

本文主要 的相关内容是 bit/json/enum/set 类类型的相关数据的存储  

这部分数据 客户端 和 服务器这边的交互 主要是以字符串的形式交互 

服务器这边的存储 相关的编码之后的整形, json 为字符串  

 mysql 中 bit的服务器客户端的数据交互 

测试数据表 以及数据如下

CREATE TABLE `tz_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `field1` bit(6) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
INSERT INTO `test`.`tz_test`(`id`, `field1`) VALUES (1, '7');

测试脚本如下 

package com.hx.test07;
/**
 * Test06MysqlTimezone
 *
 * @author Jerry.X.He
 * @version 1.0
 * @date 2023/4/24 16:26
 */
public class Test06MysqlTimezone {
    // Test06MysqlTimezone
    public static void main(String[] args) {
        String url = "jdbc:mysql://10.60.50.16:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&autoReconnectForPools=true&useSSL=false";
        String username = "root";
        String password = "root";
        JdbcTemplate jdbcTemplate = Test14GenExpertSql.getMysqlJdbcTemplate(url, username, password);
        String sql = " select * from tz_test; ";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        int x = 0;
    }
}

mysql 是将给定的 bit 的数据以 字符串的形式 交互给客户端的

mysql 服务器中对应的类型为 BIT

2cd0f3156ad64e61b44bd67a0998751b.png

bit 这边转换, 是直接获取的给定的字段对应的 字节序列

这里是 new byte[] { 0x37 }

83c5ed4a21894aae976038d7ed0982e5.png

与客户端的交互, 取出存放的 bits 的数据 

然后 拷贝到 val_buffer 响应给客户端, 这里输出了一个 '7' 

017b10e165dd489d97b409af286d339c.png

mysql 服务器 bit 的存储

是转换为单字节进行存储的  

477943a6549a41a6b575314d78bdc44c.png

 mysql 中 json 的服务器客户端的数据交互 

和上面 bit 相同 

mysql 服务器中对应的类型为 JSON

835ce55ef51f4ce986e7d61b18e679c8.png

与客户端的交互, 以 my_charset_bin 反序列化为字符串, 格式化为 json 

然后输出 json 字符串到给定的 buf 

6d7d5da51d3c4596b41034d27cf47271.png

mysql 服务器 json的存储

将给定的 json 的 字符串以 my_charset_bin 序列化为 二进制, 以二进制的形式存储

以下代码 基于 mysql-8.0.23

6a43fe7b0c6a443e8b1a3e16c7e67ac7.png

e6018e19fd5642e2ad35749a475daa20.png

 mysql 中 enum的服务器客户端的数据交互 

和上面 bit 相同 

mysql 服务器中对应的类型为 STRING? 为什么不是 ENUM 

b44f31187e1845188fa1bea22c801ab8.png

与客户端的交互, 获取当前字段 在枚举的索引, 然后 根据配置的选项列表 获取对应的字符串表示

45b75211e57f465d8ea6581f0b66cc80.png

mysql 服务器 enum 的存储

根据输入的 枚举字符 获取索引, 然后 存储的是具体的索引

0d2e290afbdd4f73a96a6156ff6a6d0d.png

假设输入的字段值 不在枚举列表中, 则存放的是 0, 表示的空字符串

0310debc806941f8a4ac3e998e258719.png

数据的存储是根据索引的值域 按不同的长度进行存储

a24938127ef84ec991da044672f576d9.png

 mysql 中 set 的服务器客户端的数据交互

和上面 bit 相同 

mysql 服务器中对应的类型为 STRING? 为什么不是 SET 

acf9a8e7121742368676ef274b3dcfb8.png

与客户端的交互, 从当前字段的值中 按照权重 获取相应的字符串表示, 并用 分隔符 连接起来

d3ed814b700a465eb7a1700212ffcbb6.png

mysql 服务器 set 的存储

可以看到 boy, girl, unknown 的索引分别为 0, 1, 2, 权重分别为 1, 2, 4

因此 这里存储的 girl, unknown 为 2 + 4 = 6

数据的存储 和上面 enum 一致, 根据存储的值的取值区间 按不同的长度进行存储 

52b6ba161199459e9d2d631e20b62de8.png

对于匹配不上的值 这里的处理是 直接过滤掉

299dcbdd87354717b7238bfb03f8ac31.png

到此这篇关于mysql bit/json/enum/set 的数据存储的文章就介绍到这了,更多相关mysql 数据存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL子查询操作实例详解

    MySQL子查询操作实例详解

    这篇文章主要介绍了MySQL子查询操作,结合实例形式较为详细的分析了mysql表的创建、常见子查询运算与关键字使用技巧,需要的朋友可以参考下
    2018-06-06
  • 详解使用navicat连接远程linux mysql数据库出现10061未知故障

    详解使用navicat连接远程linux mysql数据库出现10061未知故障

    这篇文章主要介绍了navicat连接远程linux mysql数据库出现10061未知故障,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • MySQL不能显示中文问题及解决

    MySQL不能显示中文问题及解决

    这篇文章主要介绍了MySQL不能显示中文问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • linux采用binary方式安装mysql

    linux采用binary方式安装mysql

    这篇文章主要为大家详细介绍了linux采用binary方式安装mysql步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • MYSQL关联关系查询方式

    MYSQL关联关系查询方式

    文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家
    2025-02-02
  • 解决Linux下Tomcat向MySQL插入数据中文乱码问题

    解决Linux下Tomcat向MySQL插入数据中文乱码问题

    本文给大家介绍的是如何解决win平台下开发的项目移植到Linux平台后,向MySQL插入数据时中文出现乱码的问题,非常的简单实用,有需要的小伙伴可以参考下
    2018-04-04
  • MySQL学习之日期函数的用法详解

    MySQL学习之日期函数的用法详解

    本文将学习MySQL的日期函数,在前面章节的练习中,我们就利用过NOW()函数来获取过当前系统时间,用DATEDIFF函数来计算日期相差的天数,接下来我们就系统的学习一下 日期函数
    2022-08-08
  • MySQL中的性别字段到底加不加索引

    MySQL中的性别字段到底加不加索引

    这篇文章主要介绍了MySQL中的性别字段到底加不加索引问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • MySQL 迁移OB Oracle场景中自增主键实践操作

    MySQL 迁移OB Oracle场景中自增主键实践操作

    这篇文章主要介绍了MySQL 迁移OB Oracle场景中自增主键实践操作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • MySQL ERROR 1045 (28000): Access denied for user ''root''@''localhost'' (using password: NO) 的原因分解决办法

    MySQL ERROR 1045 (28000): Access denied for user ''root''@''

    这篇文章主要介绍了MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 的原因分解决办法的相关资料,需要的朋友可以参考下
    2016-05-05

最新评论