10bet网址
MySQL 5.7参考手册
相关文件10bet官方网站 本手册下载 本手册摘录

MySQL 5.7参考手册/数据类型/数据类型存储要求

11.7数据类型存储要求

在磁盘上存储表数据的要求取决于几个因素。不同的存储引擎表示数据类型,并以不同的方式存储原始数据。表数据可能被压缩,要么是针对一列,要么是针对整行,这会使计算表或列的存储需求变得复杂。

尽管磁盘上的存储布局不同,内部的MySQL api通信和交换关于表行的信息使用一致的数据结构,适用于所有存储引擎。

本节包括MySQL支持的每个数据类型的存储要求的指南和信息,包括使用固定大小表示数据类型的存储引擎的内部格式和大小。信息由类别或存储引擎列出。

表的内部表示的最大行大小为65,535字节,即使存储引擎能够支持更大的行。这个数字不包括或者文本列,朝向此尺寸仅提供9到12个字节。为文本数据、信息内部存储在与行缓冲区不同的内存区域中。不同的存储引擎根据它们处理相应类型的方法,以不同的方式处理该数据的分配和存储。有关更多信息,请参见第15章,替代存储引擎, 和第8.4.7节“桌柱数量和行大小的限制”

InnoDB表存储要求

看到第14.11节,“InnoDB行格式”有关存储要求的信息Innodb.表。

NDB表存储要求

重要的

NDB表使用4字节对齐;所有NDB数据存储以4个字节的倍数完成。因此,通常需要15个字节的列值在NDB桌子。例如,在NDB表,非常小的整数,短整型,MEDIUMINT, 和整数(INT)列类型每个记录每个记录都需要4个字节存储,由于对准因子。

每个位()柱子需要存储空间位。虽然个人列是不是4字节对齐,NDB为所需的前1-32位保留每行4字节(32位)列,然后是BITS 33-64的另一个4个字节,等等。

虽然A.空值本身不需要任何存储空间,NDB如果表定义包含定义的列,则每行保留4个字节空值,多达32空值列。(如果一个NDB Cluster表定义了超过32空值列最多64个空值列,然后每行保留8个字节。)

每个桌子使用NDB存储引擎需要一个主键;如果没有定义主键,则主键由NDB。这个隐藏的主键每个表记录消耗31-35个字节。

你可以使用ndb_size.pl用于估计的Perl脚本NDB存储需求。它连接到当前的MySQL(不是NDB Cluster)数据库,并创建一个报告,说明如果使用NDB存储引擎。看到第21.4.29节,“ndb_size.pl - NDBCLUSTER大小需求评估器”为更多的信息。

数字类型存储要求

数据类型 存储要求
非常小的整数 1个字节
短整型 2字节
MEDIUMINT 3个字节
INT,整数 4个字节
big 8个字节
漂浮(p) 4字节如果0 <=p<= 24,如果25 <= 8字节p< = 53
漂浮 4个字节
双(精度),真实的 8个字节
小数(,D),数字(,D) 不同;看到下面的讨论
位() 约(+ 7) / 8个字节

价值十进制(和数字)使用二进制格式表示列,该格式将九个十进制(基本10)数字包装为四个字节。为每个值的整数和分数部分的存储分别确定。九位数的每个倍数需要四个字节,而且剩下的数字需要4个字节的一部分。多余数字所需的存储空间如下表所示。

剩下的数字 的字节数
0 0
1 1
2 1
3. 2
4 2
5 3.
6 3.
7 4
8 4

日期和时间类型存储要求

时间,DATETIME, 和时间戳列,MySQL 5.6.4之前创建的表所需的存储器与从5.6.4创建的表格不同。这是由于5.6.4的变化,允许这些类型具有分数部分,这需要0到3个字节。

数据类型 安装MySQL前需要存储 从MySQL 5.6.4开始需要存储
一年 1个字节 1个字节
日期 3个字节 3个字节
时间 3个字节 3字节+分数秒存储
DATETIME 8个字节 5字节+分数秒存储
时间戳 4个字节 4字节+分数秒存储

as mysql 5.6.4,存储一年日期保持不变。然而,时间,DATETIME, 和时间戳表示不同。DATETIME更有效地打包,非小数部分需要5个字节而不是8个字节,并且所有三个部分的小数部分都需要0到3个字节,这取决于存储值的小数秒精度。

精确到小数部分的秒 存储要求
0 0字节
1、2 1个字节
3、4 2字节
5、6 3个字节

例如,时间(0),时间(2),时间(4), 和时间(6)分别使用3、4、5和6个字节。时间时间(0)是等效的,需要相同的存储。

有关时间值的内部表示的详细信息,请参见MySQL的内部结构:重要的算法和结构

存储要求

在下表中,表示非二进制字符串类型的字符和二进制字符串类型的字节声明的列长度。l表示给定字符串值的实际长度(以字节表示)。

数据类型 存储要求
CHAR () 紧凑的InnoDB行格式家族优化了变长字符集的存储。看到紧凑行格式存储特性。除此以外,×w字节,< =< =255,那里w是字符集中最大长度字符所需的字节数。
二进制() 字节,0< =< =255.
VARCHAR (),VARBINARY () l+ 1字节如果列值需要0−255字节,l+ 2字节,如果值可能需要超过255字节
TINYBLOB,TinyText. l+ 1个字节,在哪里l< 28
,文本 l+ 2字节,其中l< 216.
MEDIUMBLOB,简单 l+ 3字节,其中l< 224.
LONGBLOB,longtext. l+ 4字节,其中l< 232.
枚举('value1.”、“价值2.”,……) 1或2字节,取决于枚举值的数量(最多65,535个值)
设置(“value1.”、“价值2.”,……) 1、2、3、4或8字节,取决于集合成员的数量(最多64个成员)

使用长度前缀加数据存储可变长度字符串类型。长度前缀根据数据类型需要一到四个字节,并且前缀的值是l(字符串的字节长度)。例如,存储一个简单值要求l存储值的字节加上存储值的长度的三个字节。

计算用于存储特定的字节数字符,varchar., 或者文本列值,您必须考虑该列用于该列的字符集以及值是否包含多字节字符。特别是,使用时use utf8Unicode字符集,您必须记住,并非所有字符都使用相同数量的字节。utf8mb3utf8mb4字符集可以分别要求每个字符最多三个字节和四个字节。为不同的存储所使用的分类utf8mb3或者utf8mb4人物,看到章节10.9,“Unicode支持”

varchar.,VARBINARY,文本类型是变长类型。对于每一种,存储要求取决于以下因素:

  • 列值的实际长度

  • 列的最大可能长度

  • 用于列的字符集,因为有些字符集包含多字节字符

例如,一个varchar(255)列可以包含最大长度为255个字符的字符串。假设该列使用latin1字符集(每个字符一个字节),实际需要的存储是字符串的长度(l),加上一个字节来记录字符串的长度。对于字符串“abcd”,l是4,存储要求是五个字节。如果换算使用相同的列以使用ucs2双字节字符集,存储要求为10字节:长度“abcd”是8个字节,列需要两个字节来存储长度,因为最大长度大于255(最多510字节)。

的有效最大数目字节可以存储在varchar.或者VARBINARY列受到65,535个字节的最大行大小,在所有列之间共享。为一个varchar.列,存储多字节字符的有效最大数目字符少。例如,utf8mb3每个字符最多需要三个字节,因此varchar.使用utf8mb3字符集可以声明为最多21,844个字符。看到第8.4.7节“桌柱数量和行大小的限制”

Innodb.编码大于或等于768字节的固定长度字段,其长度为可变长度字段,可以在页面上存储。例如,一个CHAR (255)如果字符集的最大字节长度大于3,列可以超过768个字节,就像与utf8mb4

NDB存储引擎支持变宽列。这意味着varchar.NDB Cluster表中的列需要与任何其他存储引擎相同的存储量,除了这些值是4字节对齐的。因此,该字符串“abcd”存储在A.瓦尔(50)列使用latin1字符集需要8个字节(而不是5个字节的相同的列值在一个MyISAM桌子)。

文本列在不同的情况下实现NDB存储引擎,其中a文本柱是由两个独立的部分组成。其中一个是固定大小(256字节),实际上存储在原始表中。另一个由超过256字节的数据组成,这些数据存储在一个隐藏表中。第二个表中的行总是2000字节长。这意味着a的大小文本列为256,如果大小< = 256 (大小表示行大小);否则,大小为256 +大小+ (2000 × (大小- 256)%2000)。

大小为枚举对象由不同枚举值的数量确定。一个字节用于最多255个可能值的枚举。两个字节用于具有256到65,535个可能值的枚举。看到第11.3.5节“枚举类型”

a的大小对象由不同集合成员的数量决定。如果设置大小为N,物体占据(N+ 7) / 8字节,四舍五入到1、2、3、4或8字节。一个最多可以有64个成员。看到第11.3.6节,“SET类型”

空间类型存储要求

MySQL使用4个字节存储几何值,以表示SRID后跟值的WKB表示。的长度()函数返回值存储所需的字节空间。

有关WKB和空间值的内部存储格式的描述,请参见第11.4.3节,“受支持的空间数据格式”

JSON存储需求

一般来说,存储要求JSON列与a大致相同LONGBLOB或者longtext.列;也就是说,JSON文档所消耗的空间与存储在这些类型之一的列中的文档字符串表示所消耗的空间大致相同。但是,二进制编码(包括查找所需的元数据和字典)会增加JSON文档中存储的单个值的开销。例如,存储在JSON文档中的字符串需要4到10个字节的额外存储,这取决于字符串的长度和存储它的对象或数组的大小。

此外,MySQL对存储在A中的任何JSON文档的大小限制JSON列,使其不能大于的值max_allowed_packet