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, 然后以八字节存储

相关推荐
️学习的小王20 分钟前
MySQL常用函数知识点总结
数据库·mysql·oracle
万亿少女的梦1681 小时前
基于Spring Boot、Java与MySQL的同城宠物服务系统设计与实现
java·spring boot·mysql·系统设计·协同过滤
万亿少女的梦1681 小时前
基于Spring Boot、Vue与MySQL的私人健身教练预约管理系统设计
java·spring boot·mysql·vue·预约管理
灯澜忆梦12 小时前
【MySQL12】进阶篇 | SQL优化
数据库·sql·mysql·性能优化
东方护航数据恢复(深圳)19 小时前
MySQL_Oracle数据库崩溃修复全攻略_东方护航数据恢复深圳店
数据库·mysql·oracle
ruleslol20 小时前
index merge避免回表
mysql
码农颜21 小时前
5.5.2 MVCC 多版本实现
java·数据库·mysql
北风toto1 天前
MySQL 批量随机化主键 ID,如何同步更新关联子表?
数据库·mysql
2501_937860941 天前
MySQL CRUD 增删改查
数据库·mysql
竹枝溪1 天前
MySQL数据库零基础入门
数据库·sql·mysql·navicat·ddl·dml·dql