10 mysql tiny/small/medium/big int 的数据存储

前言

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

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

本文主要 的相关内容是 int 类类型的相关数据的存储

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

服务器这边的存储 主要是 单字节存储, 双字节存储, 三字节存储, 四字节存储, 八字节存储

mysql类型 和 java类型对应

驱动的 ResultSetImpl 获取数据的时候有一层封装

因此不管是 tinyint, smallint, medinumint, int 在业务代码上面获取到的都是 Integer 接收

unsigned_int 因为 java 中 int 已经覆盖不了值域, 因此使用了 long 来接受

bigint 对应于类型 long 接收

unsigned_bigint 和上面 unsigned_int 同理, 使用了 BigInteger 接收

decimal, unsigned_bigdecimal 使用了 BigDecimal 接收

float, double 使用 Float, Double 接收

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

创建表 以及插入测试数据

复制代码
CREATE TABLE `tz_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `field1` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

INSERT INTO `test`.`tz_test`(`id`, `field1`) VALUES (1, '122');

测试脚本如下

复制代码
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 是将给定的 tiny int 的数据以 字符串的形式 交互给客户端的

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

与客户端的交互, 将给定的 tinyint 转换为 十进制 的字符串表示, 然后 响应回去

因为是数字在大多数的编码中都是相同的, 所以这里 my_charset_numeric 直接在 mysql 中定义的是 my_charset_latin1

mysql服务器 中 t inyint 数据存储

以单字节存储, 可以分为 无符号 和 有符号

这里可以看出, 如果你设置的数字超出了 单字节 可以表示的数据的值域, mysql 会将值调整为边界, 比如如下 语句, 会将 field1 更新为 127

update tz_zone set field1 = 399 where id = '1';

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

和上面 tinyint 相同

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

与客户端的交互 的转换 和 tinyint 的处理类似

mysql 服务器 smallyint 的存储

以双字节存储, 可以分为 无符号 和 有符号

这里可以看出, 如果你设置的数字超出了 单字节 可以表示的数据的值域, mysql 会将值调整为边界, 比如如下 语句, 会将 field1 更新为 32767

update tz_zone set field1 = 399999999 where id = '1';

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

和上面 tinyint 相同

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

与客户端的交互 的转换 和 tinyint 的处理类似

mysql 服务器 mediumint 的存储

以三字节存储, 可以分为 无符号 和 有符号

这里可以看出, 如果你设置的数字超出了 单字节 可以表示的数据的值域, mysql 会将值调整为边界, 比如如下 语句, 会将 field1 更新为 8388607

update tz_zone set field1 = 399999999 where id = '1';

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

和上面 tinyint 相同

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

与客户端的交互 的转换 和 tinyint 的处理类似

mysql 服务器 int 的存储

以四字节存储, 可以分为 无符号 和 有符号

这里可以看出, 如果你设置的数字超出了 单字节 可以表示的数据的值域, mysql 会将值调整为边界, 比如如下 语句, 会将 field1 更新为 2147483647

update tz_zone set field1 = 39999999999999 where id = '1';

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

和上面 tinyint 相同

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

与客户端的交互 的转换 和上面同理, 获取到 longlong, 然后再基于 longlong10_to_str 转换为 字符串表示

mysql 服务器 bigint 的存储

将传入的 longlong 转换为 longlong, 然后以八字节存储

相关推荐
ob熔天使——武2 小时前
MySQL
数据库·mysql
野生技术架构师7 小时前
MySQL数据实时同步到Elasticsearch的高效解决方案
数据库·mysql·elasticsearch
焦虑的二狗11 小时前
Mac下载mysql
数据库·mysql·macos
weixin_4569042711 小时前
控制台打开mysql服务报错解决办法
数据库·mysql
绅士范er12 小时前
【mysql 的安装及使用】
mysql
C1829818257514 小时前
幻想读 通过多版本并发控制(MVCC)和间隙锁(Gap Lock)的组合也能防止幻读具体说下
mysql
鲁子狄16 小时前
[笔记] 动态 SQL 查询技术解析:构建灵活高效的企业级数据访问层
java·spring boot·笔记·sql·mysql·mybatis
Dubhehug17 小时前
8.数据库索引
数据库·mysql·索引·索引分类·索引优缺点
冬夜戏雪18 小时前
阿里云ubuntu安装mysql docker容器(拉,运行,测试完整版)
mysql·ubuntu·阿里云
楼兰胡杨18 小时前
MySQL 更新字段的值为当前最大值加1
mysql