mysql中一个中文汉字占用的字节数并不固定,核心取决于当前数据库、数据表或者字段使用的字符集配置,不同的字符集编码规则会直接影响中文的存储大小。

不同字符集下中文汉字的字节占用情况
mysql中常用的支持中文的字符集主要有utf8、utf8mb4、gbk、gb2312等,不同字符集对中文的编码规则不同,具体占用字节数如下:
| 字符集 | 中文汉字占用字节数 | 说明 |
|---|---|---|
| gbk | 2字节 | gbk字符集固定用2个字节编码中文汉字,兼容gb2312 |
| gb2312 | 2字节 | gb2312是早期中文编码标准,中文固定占2字节 |
| utf8 | 3字节 | mysql中的utf8是阉割版的utf8,最多支持3字节字符,中文属于3字节范围 |
| utf8mb4 | 3或4字节 | utf8mb4是完整版utf8,大部分中文占3字节,生僻中文占4字节 |
如何查看当前字段的字符集
可以通过查询数据表的字段信息来确认具体字段使用的字符集,执行以下sql语句即可:
-- 查看指定表的字段字符集信息,替换table_name为实际表名 SHOW FULL COLUMNS FROM table_name;
执行后结果中的Collation字段会显示字符集排序规则,比如utf8mb4_general_ci就代表该字段使用utf8mb4字符集。
验证中文占用字节数的方法
可以使用mysql内置的LENGTH函数和CHAR_LENGTH函数来验证中文的字节占用情况:
LENGTH(str):返回字符串占用的字节数CHAR_LENGTH(str):返回字符串的字符数
执行以下测试语句可以直观看到不同字符集下的差异:
-- 测试utf8mb4字符集下的中文占用字节数,先确保当前连接使用utf8mb4字符集
SET NAMES utf8mb4;
-- 插入一个普通中文
SELECT LENGTH('中') AS byte_length, CHAR_LENGTH('中') AS char_length;
-- 插入一个生僻中文(𪚥,四个龙组成的字)
SELECT LENGTH('𪚥') AS byte_length, CHAR_LENGTH('𪚥') AS char_length;
普通中文执行后byte_length为3,char_length为1,说明普通中文在utf8mb4下占3字节;生僻中文执行后byte_length为4,char_length为1,说明生僻中文占4字节。
实际开发中的注意事项
在设计存储中文的字段时,需要根据使用的字符集合理设置字段长度:
- 如果使用gbk字符集,
VARCHAR(255)最多可以存储255个中文汉字 - 如果使用utf8字符集,
VARCHAR(255)最多可以存储85个中文汉字(255/3=85) - 如果使用utf8mb4字符集,考虑到生僻字的情况,
VARCHAR(255)最多建议存储63个中文汉字(255/4≈63)
另外需要注意,mysql建表时如果没有显式指定字符集,会继承数据库的默认字符集,所以建表时最好显式指定需要的字符集,避免出现存储异常。