Mysql Varchar(n) 占用字符、字节数浅析
一、概述
varchar(n) 括号中的 n 代表最大可容纳的字符的个数,注意,并不是代表字节的个数
一个中文和一个英文都是一个字符,只不过 mysql 的编码格式不同时,一个英文和一个中文所占用的存储字节数不同,一个英文字符占用的字节数是 1,中文字符和英文字符不同,以下是常用的编码格式下中文字符所占用的字节数
- gbk: 一个中文占用 2 Byte
- utf8: 一个中文占用 3 Byte
- utf8mb4: 一个中文占用 4 Byte
二、案例分析
需要强调一点,varchar(n) 列显示的存储需要比实际字符要多 1 或者 2,这是因为 varchar 类型要用一个到两个字节来记录字节长度,如果 n < 255 时,用一个字节记录,n > 255 时,使用两个字节记录
字段类型为 varchar(32),32 代表的什么?
32 代表的是 32 个字符,不是 32 个字节
字段类型为 varchar(32),在 gbk 字符集下,最多可以存多少英文,占用多少字节?
32 个英文,占用字节数 32 * 1 + 1 = 33 个字节
字段类型为 varchar(32),在 gbk 字符集下,最多可以存多少汉字,占用多少字节?
32 个汉字,占用字节数 32 * 2 + 1 = 65 个字节
字段类型为 varchar(32),在 utf8 字符集下,最多可以存多少英文,占用多少字节?
32 个英文,占用字节数 32 * 1 + 1 = 33 个字节
字段类型为 varchar(32),在 utf8 字符集下,最多可以存多少汉字,占用多少字节?
32 个汉字,占用字节数 32 * 3 + 1 = 97 个字节
字段类型为 varchar(32),在 utf8mb4 字符集下,最多可以存多少英文,占用多少字节?
32 个英文,占用字节数 32 * 1 + 1 = 33 个字节
字段类型为 varchar(32),在 utf8mb4 字符集下,最多可以存多少汉字,占用多少字节?
32 个汉字,占用字节数 32 * 4 + 1 = 129 个字节
字段类型为 varchar(32),在 utf8 字符集下,"小a2大A2" 占用多少字符,占用多少字节?
6 个字符,3 + 1 + 1 + 3 + 1 + 1 + 1 = 11 个字节
三、如何选择合适的字符集
- 如果是内部人员使用,则使用 gbk,节省空间和带宽
- 如果有交互,则使用 utf8
- 如果需要支持特殊字符,例如 emoji 表情,则使用 utf8mb4