# 11.7 数据类型存储要求

表的内部表示最大行大小为 65,535 字节,即使存储引擎能够支持更大的行。这个数字不包括斑点要么文本列,仅占此大小的 9 到 12 个字节。为了斑点文本数据,信息在内部存储在与行缓冲区不同的内存区域中。不同的存储引擎根据它们用于处理相应类型的方法,以不同的方式处理这些数据的分配和存储。有关详细信息,请参阅第 16 章,替代存储引擎, 和第 8.4.7 节,“表列数和行大小的限制”.

# InnoDB 表存储要求

第 15.10 节,“InnoDB 行格式”有关存储要求的信息InnoDB表。

# NDB 表存储要求

重要的

新开发银行表格使用 4 字节对齐;全部新开发银行数据存储以 4 字节的倍数进行。因此,通常占用 15 个字节的列值需要 16 个字节新开发银行桌子。例如,在新开发银行小音,小灵通,中型, 和整数(INT) 列类型由于对齐因素,每条记录需要 4 个字节的存储空间。

每个少量(**)列需要*位的存储空间。虽然是个人少量列是不是*4字节对齐,新开发银行每行保留 4 个字节(32 位)用于所需的前 1-32 位少量列,然后是位 33-64 的另外 4 个字节,依此类推。

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

每个表使用新开发银行存储引擎需要一个主键;如果您没有定义主键,则会创建一个“隐藏的”主键新开发银行.这个隐藏的主键每条表记录消耗 31-35 个字节。

您可以使用数据库_大小.plPerl 脚本估计新开发银行存储要求。它连接到当前的 MySQL(不是 NDB Cluster)数据库,并创建一个关于该数据库在使用新开发银行存储引擎。看第 23.5.28 节,“ndb_size.pl — NDBCLUSTER 大小需求估计器”了解更多信息。

# 数字类型存储要求

数据类型 需要存储
小音 1 个字节
小灵通 2 个字节
中型 3 个字节
INT,整数 4字节
大整数 8 个字节
漂浮(*p*) 如果 0 \<= 则为 4 个字节*p\<= 24,如果 25 \<= 则为 8 个字节p*\<= 53
漂浮 4字节
双[精度],真实的 8 个字节
十进制(**,*D*),数字(**,*D*) 变化;见以下讨论
少量(**) 大约 (+7)/8 字节

价值观十进制(和数字) 列使用二进制格式表示,该格式将九个十进制(以 10 为基数)数字打包成四个字节。每个值的整数和小数部分的存储分别确定。每个九位数字的倍数需要四个字节,而“剩余”数字需要四个字节的一部分。下表给出了多余数字所需的存储空间。

剩余数字 字节数
0 0
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4

# 日期和时间类型存储要求

为了时间,约会时间, 和时间戳列,在 MySQL 5.6.4 之前创建的表所需的存储与从 5.6.4 开始创建的表不同。这是由于 5.6.4 中的更改允许这些类型具有小数部分,这需要 0 到 3 个字节。

数据类型 MySQL 5.6.4 之前需要存储 MySQL 5.6.4 所需的存储空间
1 个字节 1 个字节
日期 3 个字节 3 个字节
时间 3 个字节 3 字节 + 小数秒存储
约会时间 8 个字节 5 字节 + 小数秒存储
时间戳 4字节 4 字节 + 小数秒存储

从 MySQL 5.6.4 开始,存储日期保持不变。然而,时间,约会时间, 和时间戳有不同的表示。约会时间更有效地打包,非小数部分需要 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 内部结构:重要的算法和结构 (opens new window).

# 字符串类型存储要求

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

数据类型 需要存储
字符(**) 紧凑的 InnoDB 行格式系列优化了可变长度字符集的存储。看COMPACT 行格式存储特性.否则,*×w字节,<= ** <=255,在哪里w*是字符集中最大长度字符所需的字节数。
二进制(**) **字节,0<= ** <= 255
VARCHAR(**), 变量(**) 大号+ 1 个字节,如果列值需要 0 - 255 个字节,大号+ 2 个字节,如果值可能需要超过 255 个字节
小斑点, 小文本 大号+ 1 个字节,其中*大号* \< 28
斑点, 文本 大号+ 2 个字节,其中*大号* \< 216
中块, 中文本 大号+ 3 个字节,其中*大号* \< 224
长块, 长文 大号+ 4 个字节,其中*大号* \< 232
枚举('*价值1*','*价值2*',...) 1 或 2 个字节,取决于枚举值的数量(最多 65,535 个值)
放('*价值1*','*价值2*',...) 1、2、3、4 或 8 个字节,取决于集合成员的数量(最多 64 个成员)

可变长度字符串类型使用长度前缀加数据存储。长度前缀根据数据类型需要一到四个字节,前缀的值为*大号(字符串的字节长度)。例如,存储一个中文本价值要求大号*字节存储值加上三个字节存储值的长度。

计算用于存储特定的字节数字符,VARCHAR, 要么文本列值,您必须考虑用于该列的字符集以及该值是否包含多字节字符。特别是,当使用utf8Unicode 字符集,您必须记住,并非所有字符都使用相同的字节数。utf8mb3utf8mb4字符集每个字符最多分别需要三个和四个字节。对于用于不同类别的存储的细分utf8mb3要么utf8mb4字符,见第 10.9 节,“Unicode 支持”.

VARCHAR,变量, 和斑点文本类型是可变长度类型。对于每个,存储要求取决于以下因素:

  • 列值的实际长度

  • 列的最大可能长度

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

    例如,一个VARCHAR(255)column 可以保存最大长度为 255 个字符的字符串。假设该列使用拉丁语1字符集(每个字符一个字节),实际需要的存储是字符串的长度(大号),加上一个字节来记录字符串的长度。对于字符串'A B C D',*大号*为 4,存储要求为 5 个字节。如果同一列被声明为使用ucs2双字节字符集,存储要求为10字节:长度'A B C D'是 8 个字节,并且该列需要两个字节来存储长度,因为最大长度大于 255(最多 510 个字节)。

    有效最大数量字节可以存储在一个VARCHAR要么变量列的最大行大小为 65,535 字节,由所有列共享。为一个VARCHAR存储多字节字符的列,有效的最大数量人物少。例如,utf8mb4每个字符最多需要四个字节,所以一个VARCHAR使用的列utf8mb4字符集最多可以声明为 16,383 个字符。看第 8.4.7 节,“表列数和行大小的限制”.

InnoDB将长度大于或等于 768 字节的固定长度字段编码为可变长度字段,可以在页外存储。例如,一个字符(255)如果字符集的最大字节长度大于 3,则列可以超过 768 个字节,因为它与utf8mb4.

新开发银行存储引擎支持可变宽度列。这意味着一个VARCHARNDB Cluster 表中的列需要与任何其他存储引擎相同的存储量,但这些值是 4 字节对齐的。因此,字符串'A B C D'存储在一个VARCHAR(50)列使用拉丁语1字符集需要 8 个字节(而不是 5 个字节用于同一列值)MyISAM桌子)。

文本,斑点, 和JSON列在新开发银行存储引擎,其中列中的每一行由两个独立的部分组成。其中之一是固定大小(256 字节文本斑点, 4000 字节JSON),并且实际上存储在原始表中。另一个包含超过 256 字节的任何数据,这些数据存储在隐藏的 blob 部分表中。第二个表中的行大小由列的确切类型决定,如下表所示:

类型 斑点零件尺寸
斑点,文本 2000
中块,中文本 4000
长块,长文 13948
JSON 8100

这意味着一个大小文本如果列是 256*尺寸\<= 256(其中尺寸表示行的大小);否则,大小为 256 +尺寸+ (2000 × (尺寸*− 256) % 2000)。

没有 blob 部分被单独存储新开发银行为了小斑点要么小文本列值。

你可以增加一个新开发银行blob 列的 blob 部分最大为 13948 使用NDB_COLUMN创建或更改父表时在列注释中。在 NDB 8.0.30 及更高版本中,还可以为文本,斑点, 要么JSON列,使用NDB_TABLE在列评论中。看新开发银行_列选项, 了解更多信息。

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

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

# 空间类型存储要求

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

有关 WKB 和空间值的内部存储格式的说明,请参阅第 11.4.3 节,“支持的空间数据格式”.

# JSON 存储要求

一般来说,存储需求JSON列与 a 的列大致相同长块要么长文柱子;也就是说,JSON 文档占用的空间与存储在其中一种类型的列中的文档字符串表示所占用的空间大致相同。但是,存储在 JSON 文档中的各个值的二进制编码(包括查找所需的元数据和字典)会产生开销。例如,存储在 JSON 文档中的字符串需要 4 到 10 个字节的额外存储空间,具体取决于字符串的长度以及存储它的对象或数组的大小。

此外,MySQL 对存储在JSON列,使其不能大于max_allowed_pa​​cket.