当前位置: 首页 > 面试题库 >

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

袁霍英
2023-03-14
问题内容

根据定义:

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个字节。



 类似资料:
  • 问题内容: 是否可以将SQL Server 2008数据库中的列类型从更改为,而不必删除表并重新创建? 每当我尝试使用SQL Server Management Studio进行操作时,SQL Server Management Studio都会向我抛出一个错误-但是让我头疼的是,很高兴知道我是否可以更改类型而不必删除和创建。 谢谢 问题答案: 您应该能够使用TSQL做到这一点。 就像是

  • 我使用并有一个MySql db表,该表是用以下方式创建的:

  • 问题内容: 我正在使用该程序包从数据库查询文本列。该数据库基于Microsoft SQL Server 2008 R2构建。SQL中列的数据类型为。 但是,当我运行时: 在SQL中,我期望(对于第一行): 但是,当我这样做时: 它返回: 255 。 所以我的问题是,是什么导致了这种截断,我该如何避免呢?谢谢!! 问题答案: 好的,看来我已经找到了解决方法。经过更多Google搜寻后,我发现: SQ

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能的重复: 对所有基于文本的字段使用通用varchar(255)有不利之处吗? 在MYSQL中,您可以为VARCHAR字段类型选择一个长度。可能的值为1-255。 但是,如果使用最大值而不是VARCHAR(20)的VARCHAR(255),它的优点是什么?据我所知,条目的大小仅取决于插入字符串的实际长度。 大小(字节)=长度+1 因此,如

  • 我想在JavaHibernate自动创建表时将255增加到1000,但如何做到这一点? 可能需要更改的部分代码:

  • 问题内容: 当前列是VARCHAR(255)NOT NULL,那么如何将其更改为TEXT NOT NULL? 注意:要更改其属性类型的列是另一列的UNIQUE KEY组合。例如 唯一键(名称,说明) 列描述当前位于varchar(255)中。因此无法更改: 错误1170(42000):在密钥规范中使用的BLOB / TEXT列’description’没有密钥长度 我需要它是TEXT,否则我需要重