varchar(255)vs tinytext / tinyblob和varchar(65535)vs blob / text

按照定义:

VARCHAR:长度的范围是1到255个字符。 除非给出BINARY关键字,否则VARCHAR值将以大小写不敏感的方式进行sorting和比较。 x + 1个字节
TINYBLOB,TINYTEXT:最大长度为255(2 ^ 8 – 1)个字符x + 1个字节的BLOB或TEXT列

所以基于这个,我创build了下面的表格:

CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255), `lastname` tinytext, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 

还是创build一个varchar或tinytext更好? 为什么

这是一样的:

VARCHAR:长度的范围是> 255个字符。 除非给出BINARY关键字,否则VARCHAR值将以大小写不敏感的方式进行sorting和比较。 x + 2个字节
BLOB,TEXT最大长度为65535(2 ^ 16 – 1)个字符x + 2个字节的BLOB或TEXT列

FROM: http : //www.pythian.com/news/7129/text-vs-varchar/

乍一看,它看起来像TEXT和VARCHAR可以存储相同的信息。 但是,TEXT字段和VARCHAR字段的工作方式之间存在着根本的区别,这一点很重要。

标准 VARCHAR实际上是ISO SQL:2003标准的一部分; TEXT数据types,包括TINYTEXT,是非标准的。

存储 TEXT数据types作为独立的对象存储在包含它们的表和结果集中。 这个存储是透明的 – 在涉及TEXT字段的查询如何写入与涉及VARCHAR字段的查询之间没有区别。 由于TEXT不是作为行的一部分存储的,因此检索TEXT字段需要额外的[编辑的1/22]内存开销。

最大VARCHAR长度VARCHAR的最大行长度受限于表的最大行长度。 对于大多数存储引擎,这是65,535字节(NDB具有不同的最大行值)。 理论上,VARCHAR的最大长度是65,536字节。 开销进一步限制了VARCHAR的实际最大大小。

如果VARCHAR字段的最大长度为0-255字节,则存储VARCHAR字段的长度需要1个字节; 如果它大于255个字节,则存储长度的开销是2个字节。 如果VARCHAR字段允许NULL值,则会增加额外的开销 – 每个表使用1个字节的开销,每个允许NULL值的8个字段的集合。 如果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 

最大文本长度文本数据types的最大大小取决于正在使用哪种types的文本数据types。 由于它们是作为对象存储的,表对象中唯一的行开销是一个指针(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 

DEFAULT值 MySQL不允许TEXT数据types具有NULL以外的默认值。 VARCHAR字段允许使用DEFAULT值创build。

结论由于存储的影响,最好使用VARCHAR而不是TINYTEXT。

如果您需要具有不为NULL的DEFAULT值,则必须使用VARCHAR(或CHAR)。

如果您需要存储长度大于64 Kb的string,请使用MEDIUMTEXT或LONGTEXT。 VARCHAR不能支持存储大的值。

确保您知道多字节字符集的影响。 VARCHAR(255)存储255个字符,可能超过255个字节。

在这种情况下, varchar更好。

请注意, varchar可以是1到65535个字符。

VARCHAR列中的值是可变长度的string。 在MySQL 5.0.3之前,长度可以指定为0到255之间的值,5.0.3和更高版本中的长度可以是0到65,535。 在MySQL 5.0.3及更高版本中,VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列之间共享)和使用的字符集。 请参见第E.7.4节“表列数和行大小限制”。

Blob被保存在文件的一个单独的部分。
它们需要额外的文件读取才能包含在数据中。
由于这个原因,varchar被获取得更快。

如果你有一个很less访问的blob,比blob更有意义。
将blob数据存储在一个单独的(部分)文件中,可以使您的核心数据文件变得更小,从而更快取得。