有任何理由使用 TINYTEXT 吗?
Is there any reason to ever use TINYTEXT?
据我所知,VARCHAR(255)
做了 TINYTEXT
能做的一切。 VARCHAR
具有相同的存储大小,它是 ISO 标准的一部分,它允许除 null 之外的默认值。我看不出有任何理由使用 TINYTEXT
。但它存在,所以也许是有原因的。
在任何情况下,TINYTEXT
是出于大小、速度或其他考虑因素的首选数据类型吗?
我能想到的 TINYTEXT
可能有用的唯一情况是如果您有 真的 大行。 VARCHAR
列的内容计入最大行大小 65,535 字节,但 TEXT
和 BLOB
数据不计入; 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
基本上没用。它的存在可能是为了保持一致性(TEXT
和 BLOB
的 4 种尺寸)。 TINYTEXT
存在于 MySQL 很久之前 VARCHAR
可以有超过 255 个字符并且之前一个字符可以超过一个字节。
TINYTEXT
实际上比 VARCHAR
有缺点。复杂的 SELECT
可能需要创建一个 tmp table(例如,对于 ORDER BY
);首选是使用 MEMORY
。回退是效率较低的 MyISAM
。任何大小的 TEXT
和 BLOB
力直接达到 MyISAM
.
一个区别是VARCHAR
中的数字是个字符; TEXT
大小以 字节 衡量。一个utf8字符最多可以占用3字节.
底线:不要使用 TINYTEXT
。 (或者TINYBLOB
,可以用VARBINARY(...)
代替。)
据我所知,VARCHAR(255)
做了 TINYTEXT
能做的一切。 VARCHAR
具有相同的存储大小,它是 ISO 标准的一部分,它允许除 null 之外的默认值。我看不出有任何理由使用 TINYTEXT
。但它存在,所以也许是有原因的。
在任何情况下,TINYTEXT
是出于大小、速度或其他考虑因素的首选数据类型吗?
我能想到的 TINYTEXT
可能有用的唯一情况是如果您有 真的 大行。 VARCHAR
列的内容计入最大行大小 65,535 字节,但 TEXT
和 BLOB
数据不计入; 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
基本上没用。它的存在可能是为了保持一致性(TEXT
和 BLOB
的 4 种尺寸)。 TINYTEXT
存在于 MySQL 很久之前 VARCHAR
可以有超过 255 个字符并且之前一个字符可以超过一个字节。
TINYTEXT
实际上比 VARCHAR
有缺点。复杂的 SELECT
可能需要创建一个 tmp table(例如,对于 ORDER BY
);首选是使用 MEMORY
。回退是效率较低的 MyISAM
。任何大小的 TEXT
和 BLOB
力直接达到 MyISAM
.
一个区别是VARCHAR
中的数字是个字符; TEXT
大小以 字节 衡量。一个utf8字符最多可以占用3字节.
底线:不要使用 TINYTEXT
。 (或者TINYBLOB
,可以用VARBINARY(...)
代替。)