为什么不将每个VARCHAR指定为VARCHAR(65535)?

tgo*_*eil 27 mysql

由于Varchar字段的存储要求基于输入的字符串的实际长度,因此将每个Varchar字段指定为最大可能的缺点是什么:Varchar(65535)?那么,除了1个额外的字节,最大字段> 255个字符?

[存储需要长度为L的字符串:如果列值需要0 - 255字节,则为L + 1个字节,如果值可能需要超过255个字节,则为L + 2个字节]

谢谢!

Ode*_*ded 13

文档 - 表列 - 计数和行大小限制:

每个表(无论存储引擎如何)的最大行大小为65,535字节.存储引擎可能会对此限制设置其他限制,从而减少有效的最大行大小.

最大行大小限制列的数量(可能是大小),因为所有列的总长度不能超过此大小.例如,utf8字符每个字符最多需要三个字节,因此对于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后续字段,请参阅帖子了解详细信息)可能会导致性能损失.

  • @tgoneil - 尝试在该列中插入65535个字符,并将数据插入其他列. (2认同)

Pab*_*ruz 8

我认为varchar列长度​​不仅仅与存储有关.它们也与数据语义有关.

IE将name列指定为varchar(100)表示存储在系统中的名称不得超过100个字符.

在存储方面,它们应该是相同的.虽然行列大小估计在varchar没有它们的列上具有特定长度会更准确(不需要统计收集系统保持varchar大小的数据分布).