MySQL如何存储varchar字段?我可以假设以下模式代表合理的存储大小:
1,2,4,8,16,32,64,128,255(最大)
通过示例澄清。假设我有一个20个字符的varchar字段。 MySQL在创建这个字段时,基本上是为32个字节保留空间(不确定它们是否为字节)但只允许输入20个字节?
我想我担心为大型表优化磁盘空间。
答案 0 :(得分:53)
要回答这个问题,在磁盘上MySql使用1 +字段中用于存储数据的大小(因此,如果列声明为varchar(45),并且字段为“FooBar”,则它将使用7个字节在磁盘上,除非您使用多字节字符集,否则它将使用14个字节)。因此,无论您声明列,它都不会对存储端产生影响(您表示您担心大型表的磁盘优化)。但是,它确实会对查询产生影响,因为当MySql创建临时表(SORT,ORDER等)时,VARCHAR会转换为CHAR,并且您可以将更多记录放入单个页面中,内存越少,表扫描速度越快是
答案 1 :(得分:24)
MySQL将varchar字段存储为可变长度记录,使用一个字节或两个字节的前缀来表示记录大小。
具有存储大小模式并不会对MySQL在处理可变长度记录存储时的运行方式产生任何影响。 varchar(x)声明中指定的长度将简单地确定可以存储的数据的最大长度。基本上,varchar(16)与varchar(128)的磁盘方式没有区别。
This manual page有更详细的解释。
编辑:关于您更新的问题,答案仍然是相同的。 varchar字段只会占用磁盘上与存储在其中的数据一样多的空间(加上一个或两个字节的开销)。因此,如果你有一个varchar(16)或一个varchar(128)并不重要,如果你在其中存储一个10个字符的字符串,你只需要使用10个字节(加上1或2个)的磁盘空间