为什么有不同的TEXT类型?

时间:2016-04-06 11:36:41

标签: mysql

据我了解,MySQL中不同TEXT列类型之间的唯一区别是存储长度所需的字节数:

TINYTEXT    L + 1 bytes, where L < 2^8  
TEXT        L + 2 bytes, where L < 2^16
MEDIUMTEXT  L + 3 bytes, where L < 2^24
LONGTEXT    L + 4 bytes, where L < 2^32

那么为什么只有一种具有最大长度的列类型并且没有必要存储长度呢?

TEXT        L bytes, where L < 2^32

2 个答案:

答案 0 :(得分:1)

这有历史原因。 MySQL是20年前设计的,它使用了当时的思想和硬件和软件限制。 32位硬件和Linux在1995年相对较新。台式计算机中安装的RAM通常大约为4-8 MB。服务器有16或32 MB。

它实施的数据库设计思想是另一个20年(或更长),当硬件和软件限制更强时(计算机程序常常运行几百千字节)。

当时,有两种不同的类型可以在数据库中存储字符串:CHARVARCHAR。它们现在仍然存在,但它们之间的差异每天都在模糊。 CHAR列的值通常具有固定长度,VARCHAR列的长度可变,不超过列创建时声明的最大长度。 (关于空白字符的处理也存在其他差异,但它们与讨论无关)

创建固定长度和可变长度字符串类型有几个原因。虽然变长似乎更好,因为它不浪费空间,但固定长度字符串列的数据可以存储在与其他固定长度数据类型(整数,日期等)的数据相同的位置。对于表的所有记录具有相同的长度在低级别是非常重要的,因为在给定行号(由索引提供)的情况下,它为查找和检索存储中的行提供了恒定的时间。可变长度字符串无法提供此功能,这就是为什么它们存储在不同的位置,使用不同的方式来检索它们。另一个地方意味着额外的磁盘读取,以便将它们放入内存,这需要时间。固定长度和可变长度的字符串类型都有优点和缺点。

关于大小,早在80年代(以及之前),RDBMSs仅用于实现CHAR / VARCHAR(最多255个字节)和TEXT。对于那时的大多数数据库系统,TEXT字段的最大长度不大于64KiB。

MySQL在1995年实现了现有数据库系统使用的数据类型并对其进行了扩展。

由于硬件改进以及过去20 - 25年内每GB存储成本的降低,产生CHARVARCHAR字符串类型及其各种大小风格的技术原因变得越来越不重要了。因此,正如您在其文档中所述,MySQL统一了内部处理和存储。

答案 1 :(得分:0)

出于同样的原因,有不同的数字大小(tinyint,smallint等):每条记录越大,它占用的空间就越多,这会占用硬盘空间,使搜索速度变慢等等,而当数字大小时scalate这个问题的记录数量也是如此。一般来说,总是尽可能使用最小的类型是明智的。

相关问题