71

MySQL如何存储varchar字段?我可以假设以下模式代表合理的存储大小:

1,2,4,8,16,32,64,128,255(最大)

通过示例进行澄清。假设我有一个 20 个字符的 varchar 字段。MySQL在创建这个字段时,基本上保留32个字节的空间(不确定它们是否是字节)但只允许输入20个?

我想我担心为一个巨大的表优化磁盘空间。

4

2 回答 2

60

为了回答这个问题,MySql 在磁盘上使用 1 + 字段中用于存储数据的大小(因此,如果该列被声明为 varchar(45),并且该字段是“FooBar”,它将在磁盘上使用 7 个字节,当然,除非您使用多字节字符集,否则它将使用 14 个字节)。因此,无论您如何声明列,它都不会在存储端产生影响(您表示您担心针对大型表的磁盘优化)。但是,它确实对查询产生了影响,因为当 MySql 创建一个临时表(SORT、ORDER 等)时,VARCHAR 被转换为 CHAR,并且您可以在单个页面中容纳的记录越多,内存越少,表扫描速度就越快是。

于 2009-07-20T05:30:45.150 回答
26

MySQL 将 varchar 字段存储为可变长度记录,使用一字节或两字节前缀表示记录大小。

存储大小的模式对 MySQL 在处理可变长度记录存储时的运行方式没有任何影响。varchar(x) 声明中指定的长度将简单地确定可以存储的数据的最大长度。基本上,varchar(16) 在磁盘方面与 varchar(128) 没有什么不同。

本手册页有更详细的解释。

编辑:关于您更新的问题,答案仍然相同。varchar 字段只会占用与存储在其中的数据一样多的磁盘空间(加上一两个字节的开销)。所以不管你有 varchar(16) 还是 varchar(128),如果你在其中存储一个 10 个字符的字符串,你只会使用 10 个字节(加上 1 或 2)的磁盘空间.

于 2009-07-20T04:13:50.843 回答