Mysql一行最大能存储多少条数据?

Mysql规定每一行最大字节数为65535

如果您已了解Mysql的Dynamic行模式的存储信息包含哪些,各占用多少字节,可以忽略此链接的内容

关键规则

  • 65535字节限制

    除了Blobs和Text这种大类型外,所有的字段(不包含隐藏列和记录头信息)占用的字节长度加起来不能超过65535。

    计算公式

    1
    所有字段的字节数 + 所有变长字段的长度字节数 + Null 值列表字节数 ≤ 65535

示例

当采用utf8编码的时候,假设已有一个int字段(4个字节,允许为空),新增一个varchar类型的字段的话最大字符数:

1
(65535 - 4 - 2 - 1) / 3 = 21842 个字符
  • 4int 类型占用字节数
  • 2varchar 的长度字段占用字节数
  • 1 为 Null 列表字节数

若使用utf8mb4编码,varchar最大字符为

1
(65535 - 4 - 2 - 1 ) / 4 = 16381 

tip:TEXT数据存储在单独的区域,不存在表的行数据中(MySQL 会对 TEXT 类型字段进行分离存储),因此不受一行规定最大字节数为65535的限制


Mysql常用字段类型及占用字节数

数值类型

数据类型 占用字节数 描述
TINYINT 1 -128到127或0到255(无符号)
SMALLINT 2 -32768到32767或0-65535(无符号)
INT 4 -2,147,483,648 到 2,147,483,647 或 0 到 4,294,967,295(无符号)
BIGINT 8 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 或 0 到 18,446,744,073,709,551,615(无符号)
FLOAT 4 单精度浮点数
DOUBLE 8 双精度浮点数

字符串类型

数据类型 占用字节数 描述
char(N) N字节 固定长度字符串,最多255个字节
varchar(N) L + 1 或 L + 2(L 为实际字符长度) 可变长度字符串,最多65535字节
TEXT L+2(L为实际字符长度) 最多 65,535 字节
LONGTEXT L + 4(L 为实际字符长度) 最多 4,294,967,295 字节

日期和时间类型

数据类型 占用字节数 描述
DATETIME 8 日期和时间,格式为 ‘YYYY-MM-DD HH:MM’
TIMESTAMP 4 时间戳,表示从 ‘1970-01-01 00:00:01’ UTC 到现在的秒数

补充知识点

TINYINT表示带符号的数为什么是-128到127?

  • 原因:计算机中为了统一加减计算规则,采用补码来表示负数。
  • 详解:第一位为0来表示正数,因此最大值为+127(0111 1111),表示负数时,因为采用补码,可以多表示一个 -128【在八位编码系统中规定128(1000 0000)==>取反(0111 1111)+1 ==> 1000 0000 来表示-128】
  • 补充:针对于8位二进制采用补码表示,最多可表示2^n个数,也就是256个数,正数是1~127(0000 0001 ~ 0111 1111)是127个数,0(0000 0000),还剩下128个,所以规定(1111 1111 ~ 1000 0000)1000 0000 位-128,因按照补码规则1000 0000-1取反还是1000 0000,因此在二进制中规定它表示-128
    补码表示负数的规则:正数的绝对值的反码+1。

为什么计算机要用补码表示法?

VARCHAR和TEXT的区别

  • 最本质的区别:varchar存储在行内,text存储在外部存储中(会在数据表的行内存储一个指针),因此如果采用text进行存储的话,会涉及到I/O操作影响性能。text的长度是不计算在行内的65535的限制里的

DATETIME和TIMESTAMP的区别

类型 是否带时区 占用空间 描述
DATETIME 5~8 字节 存储不带时区的时间
TIMESTAMP 4~7 字节 存储 UTC 时间,根据时区动态转换

serverTimeZone参数详解

serverTimeZone是JDBC的URL中的参数,用于指定web服务器和mysql服务器的会话期间的mysql服务器时区

以下是具体场景分析:

示例:

假设当前时间为 2024-11-01 18:00:10(东八区)。以下为各种配置下的存储结果:

数据库时区 JDBC 时区 DATETIME 存储值 TIMESTAMP 存储值
+8区 UTC 2024-11-01 10:00:10 2024-11-01 10:00:10
+8区 +8区 2024-11-01 18:00:10 2024-11-01 18:00:10
UTC UTC 2024-11-01 10:00:10 2024-11-01 10:00:10
UTC +8区 2024-11-01 18:00:10 2024-11-01 10:00:10

解释:

  • DATETIME 不受时区影响,存储固定的时间值。
  • TIMESTAMP 随数据库时区变化动态调整显示值。

参考资料:

小林coding MySQL 一行记录是怎么存储的?


Mysql单行存储
http://example.com/2024/10/31/2024-10-31-Mysql存储相关知识点/
作者
wyx-98
发布于
2024年10月31日
许可协议