据我所知,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(...)。)