我有一个contacts表,其中包含postcode,first name,last name,town,country,phone number等字段,所有字段都定义为VARCHAR(255),即使没有 这些字段将几乎接近255个字符。 (如果您想知道,是因为Ruby on Rails迁移默认情况下将String字段映射到VARCHAR(255),而我从不费心重写它)。
由于VARCHAR仅存储字段的实际字符数(以及字段长度),因此使用VARCHAR(16)而不是VARCHAR(255)有什么明显的优势(性能还是其他方面)?
此外,这些字段中的大多数都有索引。 字段上的较大VARCHAR大小是否会影响索引的大小或性能?
仅供参考,我正在使用MySQL 5。
@ceejayoz,声明接受的答案是不正确的,但没有解释为什么没有真正帮助。 更糟糕的是,接受的答案会随着时间而变化,您的评论会使人们误以为新的接受的答案是不正确的。
@Gili删除了我的评论,因为OP显然改变了他们的接受度。 好的观点,在将来的病态中会指出我在说什么答案以及原因。
这个重复的问题的其他一些答案stackoverflow.com/questions/1262174/
在存储中,VARCHAR(255)足够聪明,可以仅存储给定行上所需的长度,而CHAR(255)总是会存储255个字符。
但是既然你用MySQL标记了这个问题,我会提到一个特定于MySQL的提示:当行从存储引擎层复制到SQL层时,VARCHAR字段被转换为CHAR以获得使用的优势固定宽度的行。因此,内存中的字符串将填充为声明的VARCHAR列的最大长度。
当查询隐式生成临时表时(例如在排序或GROUP BY时),这会占用大量内存。如果您对不需要太长的数据使用大量的VARCHAR(255)字段,这会使临时表变得非常大。
您可能还想知道这种"填充"行为意味着使用utf8字符集声明的字符串会填充每个字符三个字节,即使对于存储单字节内容的字符串(例如ascii或latin1字符)也是如此。同样,utf8mb4字符集会使字符串在内存中每个字符填充到四个字节。
因此,存储短字符串(如"无意见")的utf8中的VARCHAR(255)在磁盘上占用11个字节(10个低字符集字符,加上一个字节用于长度),但在内存中需要765个字节,因此在临时表或排