由于Varchar字段的存储要求基于输入字符串的实际长度,指定每个Varchar字段为最大可能值:Varchar(65535)的缺点是什么呢?除了对于最大字段长度超过255个字符需要额外1个字节之外,还有什么缺点吗?
[字符串长度为L的存储需求:如果列值要求0-255字节,则为L + 1字节,如果值可能需要超过255字节,则为L + 2字节]
谢谢!
由于Varchar字段的存储要求基于输入字符串的实际长度,指定每个Varchar字段为最大可能值:Varchar(65535)的缺点是什么呢?除了对于最大字段长度超过255个字符需要额外1个字节之外,还有什么缺点吗?
[字符串长度为L的存储需求:如果列值要求0-255字节,则为L + 1字节,如果值可能需要超过255字节,则为L + 2字节]
谢谢!
根据文档-表列计数和行大小限制:
每个表(无论存储引擎如何)的最大行大小为65,535字节。存储引擎可能会对此限制施加其他约束,从而降低有效的最大行大小。
最大行大小限制了列的数量(可能还包括大小),因为所有列的总长度不能超过此大小。例如,utf8字符每个字符最多需要3个字节,因此对于一个CHAR(255) CHARACTER SET utf8列,服务器必须分配255×3=765个字节的值。因此,一个表不能包含超过65,535 / 765 = 85个这样的列。
可变长度列的存储包括长度字节,这些字节被计入行大小。例如,VARCHAR(255) CHARACTER SET utf8列需要两个字节来存储值的长度,因此每个值最多可以占用767个字节。
因此,定义一个单一的VARCHAR(65535)
列,实际上将您限制在一行中一个单独的列(假设您已经填满了它)。
除此之外,对于某些类型的数据,这样的大尺寸完全不正确 - 如果您有一个可能包含本地和国际号码的电话号码列,您可以选择使用VARCHAR
字段来实现此目的,但将其设置为超过20可能是没有意义的(我很慷慨)。
请参见Bill Karwin的这个答案,其中还指出如果临时表生成不必要长的VARCHAR
字段(与此类字段的转换为CHAR
和再次转换有关-请参见帖子了解详情),也可能会有性能惩罚。
varchar
列长度不仅与存储有关,还涉及数据语义。即在您的系统中将name
列指定为varchar(100)
表示存储的名称不得超过100个字符。varchar
大小上的数据分布。在数据库中,宽表可能会产生一些问题,因为您可能会遇到意外的记录限制(您可以设计一个比一个记录实际存储的更宽的表,有时这会导致插入操作意外失败),并且数据分散在数据页上会导致性能问题。我知道在SQL Server中使用宽表可能会出现这种情况,如果mysql也遇到类似的问题,我也不会感到惊讶。然而,只有mysql专家才能真正解决这个问题。对于宽字段,索引也可能是一个问题。数据库引擎可能不太倾向于认为索引是有用的。同样,我不确定mysql是否会有这个问题,但这是需要研究的。我知道在SQL Server中,对于所有东西都使用最大字段大小会出现这些问题,mysql可能会有这些问题或者其他SQL Server没有的问题。