探索 MySQL 中 VARCHAR(255) 的演变及其对数据库设计的影响
在 MySQL 领域,关于 VARCHAR(255) 的讨论始终不绝于耳。近期,在一个 MySQL 课程讨论区,我注意到有人提及了这一话题。这让我回想起自己初涉 MySQL 数据库设计时,一位经验丰富的同事建议动态字符串字段应使用 VARCHAR(255) 而非 VARCHAR(256)。当时,对于这一建议背后的原因,我并不十分明了,只知道这是出于节省空间的考虑。后来经过深入研究官方文档和一系列测试,我终于揭开了这一谜团。趁此机会,我将这些心得整理分享给大家。
在探讨 VARCHAR(255) 与 VARCHAR(256) 的区别时,我们主要关注两个方向:存储空间和索引键长度。注:未必一定是 256,只是作为超出临界值 255 的例子。另,本文基于 INNODB 存储引擎讨论,这里还是要说明一下。
存储空间分析
VARCHAR 类型用于存储可变长度的字符串。其存储需求不仅包括字符串本身,还需额外 1 或 2 个字节来记录字符串长度。具体来说,如果字符串长度在 0-255 字节之间,则需额外 1 个字节;若超过 255 字节,则需 2 个字节。
字符串的存储空间受三个因素影响:实际长度、最大可能长度以及字符集。
实例解析
假设有一个名为 memo 的列,其类型为 VARCHAR(255)。
对于 ASCII 或 Latin 这样的单字节字符集,字符串’abcd’的存储空间为 4(字符串实际长度)+ 1(长度记录字节)= 5 字节。记录字符串长度的字节为 1,因为最大可能长度为 255 个字节,小于等于 255。
然而,若使用 utf8mb4 这样的多字节字符集,一个字符占用 4 字节,那么同样的字符串存储空间则为 4*4(字符串实际长度)+ 2(长度记录字节)= 18 字节。记录字符串长度的字节为 2,因为最大可能长度为 255*4=1020 个字节,大于 255。
小结
在存储空间方面,VARCHAR(255) 与 VARCHAR(256) 的差异主要体现在单字节字符集下,VARCHAR(255) 可以节省 1 个字节的空间。即 255 是临界值。
索引键长度分析
在 MySQL 中,行格式(ROW_FORMAT)决定了记录在磁盘上的存储方式。对于不含 VARCHAR、TEXT 等可变长度字段的表,其行格式为 FIXED,每条记录占用相同空间。而含有这些字段的表则为动态表,每条记录的空间占用是变化的。
动态 ROW_FORMAT 有四种类型:DYNAMIC、COMPRESSED、REDUNDANT、COMPACT。
其中,REDUNDANT 和 COMPACT 格式的索引键最大长度为 767 字节。REDUNDANT 用于 MySQL 5.0.3 以前版本,COMPACT 用于 MySQL 5.0.3 到 MySQL 5.7.8 版本。
而 DYNAMIC 和 COMPRESSED 格式则可达 3072 字节。DYNAMIC 从 MySQL 5.7.9 版本开始即作为默认格式。
字符集与索引键长度的关系
以 utf8mb4 字符集为例,若行格式为 COMPACT,索引键最大长度为 767 字节,这意味着在 utf8mb4 字符集下,索引键长度不能超过 191 字符(767/4=191.75)。而 DYNAMIC 格式则允许 768 字符(3072/4=768)的最大索引键长度。
在字符集为 UTF8 这种三字节字符集且行格式 为 REDUNDANT 或 COMPACT 时,索引键最大长度为 255 字符(767/3≈255.667)。
其它不一一列举了。
关键点小结
VARCHAR(255) 与 VARCHAR(256) 在索引键长度上的差异,仅在特定条件下显现,例如字符集为 UTF8(三字节字符集)且行格式为 REDUNDANT 或 COMPACT 时。
总结与思考
VARCHAR(255) 的特殊性仅在某些特定场景下成立。存储空间的 1 个字节差异仅在单字节字符集下有意义,而索引键长度问题仅影响 MySQL 5.7.8 及之前版本且使用三字节字符集比如 UTF8 的情况。
上面提到的 255、767、3072 确实都是不同场合下的临界值。但注意它们的单位是字节,需要根据所使用的字符集做换算。
回顾历史,MySQL 4.1 及之前版本中,VARCHAR 的最大长度确实是 255,这可能是 VARCHAR(255) 最初广泛使用的原因。值得注意的是,在那个时代,VARCHAR(n)的单位是字节。
最终,数据库设计应基于业务需求,结合使用的 MySQL 版本和字符集。在满足需求的前提下,字段长度越短越好,而非盲目遵循或纠结所谓的经验值。毕竟,有些经验在新的时代可能已经不再或不完全适用。
版权声明: 本文为 InfoQ 作者【Steven】的原创文章。
原文链接:【http://xie.infoq.cn/article/607603b8269454238a64e5b76】。文章转载请联系作者。
评论