Mysql一行最大能存储多少条数据?
Mysql规定每一行最大字节数为65535
如果您已了解Mysql的Dynamic行模式的存储信息包含哪些,各占用多少字节,可以忽略此链接的内容
关键规则
65535字节限制
除了Blobs和Text这种大类型外,所有的字段(不包含隐藏列和记录头信息)占用的字节长度加起来不能超过65535。
计算公式
1
所有字段的字节数 + 所有变长字段的长度字节数 + Null 值列表字节数 ≤ 65535
示例
当采用utf8
编码的时候,假设已有一个int字段(4个字节,允许为空),新增一个varchar
类型的字段的话最大字符数:
1 |
|
4
为int
类型占用字节数2
为varchar
的长度字段占用字节数1
为 Null 列表字节数
若使用utf8mb4编码
,varchar最大字符为
1 |
|
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。
为什么计算机要用补码表示法?
- 详解:为什么计算机中的负数要用补码表示?
- 优势:补码表示法不仅削除了减法运算,还保证了0的唯一性
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 随数据库时区变化动态调整显示值。
参考资料:
Mysql单行存储
http://example.com/2024/10/31/2024-10-31-Mysql存储相关知识点/