来自:http :
//www.pythian.com/news/7129/text-vs-
varchar/
乍一看,看起来TEXT和VARCHAR可以存储相同的信息。但是,TEXT字段和VARCHAR字段的工作方式之间存在根本差异,需要考虑到这些差异。
标准 VARCHAR实际上是ISO SQL:2003标准的一部分;TEXT数据类型(包括TINYTEXT)是非标准的。
存储 TEXT数据类型存储为与表和包含它们的结果集不同的对象。此存储是透明的-
涉及TEXT字段的查询与涉及VARCHAR字段的查询的写入方式没有区别。由于TEXT不存储为行的一部分,因此检索TEXT字段需要额外的[已编辑的1/22]内存开销。最大VARCHAR长度
VARCHAR的最大行长度受表的最大行长度限制。对于大多数存储引擎,这是65,535字节(NDB具有不同的最大行值)。理论上,VARCHAR的最大长度为65,536字节。开销进一步限制了VARCHAR的实际最大大小。如果VARCHAR字段的最大长度为0-255字节,则存储VARCHAR字段的长度将占用1个字节;如果大于255个字节,则存储长度的开销为2个字节。如果VARCHAR字段允许使用NULL值,则将增加额外的开销-
每个表对允许NULL值的8个字段的每组使用1个字节的开销。如果VARCHAR是表中的唯一行,并且不允许NULL值,则VARCHAR允许的最大长度为65,532字节。请记住,VARCHAR(x)中的数字表示字符数,而不是字节数。因此,如果字符集使用多字节字符(例如UTF-8),则尝试仅使用VARCHAR(65532)定义表可能会遇到困难。
如果尝试定义比允许的长度更长的VARCHAR值,则会遇到诸如1118或1074的错误:
ERROR 1118 (42000): Row size too large. The maximum row size for theused table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs.ERROR 1074 (42000): Column length too big for column 'col_name'(max=[max number here]); use BLOB or TEXT instead
最大TEXT长度
TEXT数据类型的最大大小取决于所使用的TEXT数据类型。因为它们存储为对象,所以表对象中唯一的行开销是指针(8或16个字节)。这是最大TEXT长度和开销(在TEXT对象中)的列表:TINYTEXT – up to 255 bytes, 1 byte overheadTEXT – up to 64 Kb, 2 bytes overheadMEDIUMTEXT – up to 16 Mb, 3 bytes overheadLonGTEXT – up to 4 Gb, 4 bytes overhead默认值 MySQL不允许TEXT数据类型具有非NULL的默认值。允许使用DEFAULT值创建VARCHAR字段。
结论 由于存在存储问题,因此最好使用VARCHAR而不是TINYTEXT。
如果需要的DEFAULT值不为NULL,则必须使用VARCHAR(或CHAR)。
如果您需要存储长于大约64 Kb的字符串,请使用MEDIUMTEXT或LONGTEXT。VARCHAR不支持存储太大的值。
确保您了解多字节字符集的影响。VARCHAR(255)存储255个字符,可能超过255个字节。



