据我所知,VARCHAR(255)
可以完成TINYTEXT
所能做的一切。 VARCHAR
具有相同的存储大小,它是ISO标准的一部分,它允许除null之外的默认值。我看不出有任何理由使用TINYTEXT
。但它存在,所以也许是有原因的。
是否存在TINYTEXT
是尺寸,速度或其他考虑因素的首选数据类型的情况?
答案 0 :(得分:5)
我能想到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字节指向外部数据的指针组成,因此{{1向行长度添加21个字节。但是,当外部值小于40个字节时,数据将内联存储在行中。因此,对于少于40个字节的TINYTEXT
,存储类似于TINYTEXT
,并且它都是根据行长度限制计算的。
答案 1 :(得分:3)
TINYTEXT
基本没用。它可能存在一致性(TEXT
和BLOB
的4种大小。早在TINYTEXT
可能有超过255个字符且字符可能超过一个字节之前,MySQL中就存在VARCHAR
。
TINYTEXT
实际上比VARCHAR
有缺点。复杂SELECT
可能需要创建一个tmp表(例如,ORDER BY
);第一个偏好是使用MEMORY
。后备效率较低MyISAM
。任意大小TEXT
和BLOB
强制直接转到MyISAM
。
差异是VARCHAR
中的数字是字符; TEXT
尺寸以字节衡量。 utf8 字符最多可占用3个字节。
底线:不要使用TINYTEXT
。 (或TINYBLOB
,可由VARBINARY(...)
替换。)