有任何理由使用 TINYTEXT 吗?

Is there any reason to ever use TINYTEXT?

据我所知,VARCHAR(255) 做了 TINYTEXT 能做的一切。 VARCHAR 具有相同的存储大小,它是 ISO 标准的一部分,它允许除 null 之外的默认值。我看不出有任何理由使用 TINYTEXT。但它存在,所以也许是有原因的。

在任何情况下,TINYTEXT 是出于大小、速度或其他考虑因素的首选数据类型吗?

我能想到的 TINYTEXT 可能有用的唯一情况是如果您有 真的 大行。 VARCHAR 列的内容计入最大行大小 65,535 字节,但 TEXTBLOB 数据不计入; TINYTEXT 列仅向行大小添加 1 个字节。

实际上,对于 InnoDB tables,事情要复杂一些。 InnoDB 存储在以下页面中进行了描述:

https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format-dynamic.html https://dev.mysql.com/doc/refman/5.7/en/innodb-compression-internals.html

总而言之,table中受上述TINYTEXT限制的部分存储的数据包括一个1字节的长度字段和一个20字节的指向外部数据的指针,因此 TINYTEXT 向行长度添加 21 个字节。但是,当外部值小于 40 字节时,数据将内联存储在行中。所以对于TINYTEXT小于40字节,存储量和VARCHAR(255)差不多,都算在行长度限制内。

TINYTEXT 基本上没用。它的存在可能是为了保持一致性(TEXTBLOB 的 4 种尺寸)。 TINYTEXT 存在于 MySQL 很久之前 VARCHAR 可以有超过 255 个字符并且之前一个字符可以超过一个字节。

TINYTEXT 实际上比 VARCHAR 有缺点。复杂的 SELECT 可能需要创建一个 tmp table(例如,对于 ORDER BY);首选是使用 MEMORY。回退是效率较低的 MyISAM。任何大小的 TEXTBLOB 力直接达到 MyISAM.

一个区别VARCHAR中的数字是个字符TEXT 大小以 字节 衡量。一个utf8字符最多可以占用3字节.

底线:不要使用 TINYTEXT。 (或者TINYBLOB,可以用VARBINARY(...)代替。)