根据定义:
VARCHAR:长度范围是1到255个字符。除非指定BINARY关键字,否则以不区分大小写的方式对VARCHAR值进行排序和比较。x + 1个字节 TINYBLOB,TINYTEXT:BLOB或TEXT列,最大长度为255(2 ^ 8-1)个字符x + 1个字节
因此,基于此,我创建了下表:
CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255), `lastname` tinytext, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1
还是创建varchar或tinytext更好, 为什么 ?
是否相同:
VARCHAR:长度范围大于255个字符。除非指定BINARY关键字,否则以不区分大小写的方式对VARCHAR值进行排序和比较。x + 2字节 BLOB,TEXT BLOB或TEXT列,最大长度为65535(2 ^ 16-1)个字符x + 2字节
来自: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 the used 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 overhead TEXT – up to 64 Kb, 2 bytes overhead MEDIUMTEXT – up to 16 Mb, 3 bytes overhead LONGTEXT – 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个字节。
乍一看,看起来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 the
used 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 overhead TEXT – up to 64 Kb, 2 bytes overhead MEDIUMTEXT – up to 16 Mb, 3 bytes overhead LONGTEXT – 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个字节。