Mysql Varchar(n) 占用字符、字节数浅析

发布时间 2023-11-27 11:31:31作者: 变体精灵

一、概述

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