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

时间:2011-10-13 14:24:31

标签: mysql

根据定义:

  

VARCHAR:Length的范围是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个字节

2 个答案:

答案 0 :(得分:147)

FROM: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,存储VARCHAR字段的长度需要1个字节   字段的最大长度为0-255字节;如果它大于255   字节,存储长度的开销是2个字节。如果是VARCHAR   字段允许NULL值,这会增加额外的开销 - 每个表   对于允许NULL的每组8个字段使用1字节的开销   值。如果VARCHAR是表中的唯一行,则不是   允许NULL值,VARCHAR允许的最大长度为65,532   字节。

     

请记住,VARCHAR(x)中的数字表示数字   字符,而不是字节数。因此,您可能会遇到困难   尝试定义一个只有VARCHAR(65532)的表(如果是字符集)   使用多字节字符,例如UTF-8。

     

如果您尝试定义比允许的值更长的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
     

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

     

结论由于存储问题,最好使用VARCHAR而不是TINYTEXT。

     

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

     

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

     

确保您了解多字节字符集的效果。   VARCHAR(255)存储255个字符,可能超过255个字节。

答案 1 :(得分:8)

在这种情况下,varchar会更好。

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

  

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

Blob保存在文件的单独部分中 它们需要额外的文件才能包含在数据中 因此,varchar的获取速度要快得多。

如果你有一个不经常访问的大blob,那么blob更有意义 将blob数据存储在单独的(部分)文件中可以使核心数据文件更小,从而更快地获取。