11

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

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

4

2 回答 2

9

我能想到的唯一TINYTEXT可能有帮助的情况是,如果你有很大的行。列的内容VARCHAR计入最大行大小 65,535 字节,但TEXT数据BLOB不计入;一TINYTEXT列仅将 1 个字节添加到行大小。

实际上,对于 InnoDB 表,事情要复杂一些。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

总而言之,表中受上述限制的部分存储的数据TINYTEXT由一个 1 字节长度的字段和一个 20 字节指向外部数据的指针组成,因此 aTINYTEXT增加了 21 个字节的行长度。但是,当外部值小于 40 字节时,数据将内联存储在行中。因此,对于TINYTEXT小于 40 字节的存储,存储类似于VARCHAR(255),并且都计入行长度限制。

于 2016-03-02T23:44:38.290 回答
4

TINYTEXT本质上是没有用的。TEXT它的存在可能是为了保持一致性(和的 4 种大小BLOB)。 TINYTEXT很久以前存在于 MySQL 中VARCHAR的字符可能超过 255 个字符,而字符可能超过一个字节。

TINYTEXT其实也有弊端VARCHAR。一个复合体SELECT可能需要创建一个 tmp 表(例如 for ORDER BY);第一个偏好是使用MEMORY. 后备是效率较低的MyISAM。任何大小TEXTBLOB力量都直奔MyISAM

不同之处在于数字VARCHAR字符TEXT大小以字节为单位。一个 utf8字符最多可占用 3个字节

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

于 2016-03-06T04:12:12.297 回答