据我所知,VARCHAR(255)
一切都TINYTEXT
可以做到。VARCHAR
具有相同的存储大小,它是 ISO 标准的一部分,它允许 null 以外的默认值。我看不出有任何理由使用TINYTEXT
. 但它存在,所以也许是有原因的。
在任何情况下,TINYTEXT
出于大小、速度或其他考虑,首选数据类型是什么?
据我所知,VARCHAR(255)
一切都TINYTEXT
可以做到。VARCHAR
具有相同的存储大小,它是 ISO 标准的一部分,它允许 null 以外的默认值。我看不出有任何理由使用TINYTEXT
. 但它存在,所以也许是有原因的。
在任何情况下,TINYTEXT
出于大小、速度或其他考虑,首选数据类型是什么?
我能想到的唯一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)
,并且都计入行长度限制。
TINYTEXT
本质上是没有用的。TEXT
它的存在可能是为了保持一致性(和的 4 种大小BLOB
)。 TINYTEXT
很久以前存在于 MySQL 中VARCHAR
的字符可能超过 255 个字符,而字符可能超过一个字节。
TINYTEXT
其实也有弊端VARCHAR
。一个复合体SELECT
可能需要创建一个 tmp 表(例如 for ORDER BY
);第一个偏好是使用MEMORY
. 后备是效率较低的MyISAM
。任何大小TEXT
和BLOB
力量都直奔MyISAM
。
不同之处在于数字VARCHAR
是字符;TEXT
大小以字节为单位。一个 utf8字符最多可占用 3个字节。
底线:不要使用TINYTEXT
. (或者TINYBLOB
,可以替换为VARBINARY(...)
。)