MySQL中varchar(N)的N实际含义及Unicode存储相关问题
MySQL varchar(N)常见问题解答
1. varchar(N)中N的含义
MySQL 5.0及之后的所有现代版本中,varchar(N)的N代表最大可存储的字符长度,而非字节容量。例如定义varchar(10)的字段,不管存储的是英文、中文还是emoji,最多都可以存入10个对应字符。只有5.0之前的老旧版本中,N才代表最大字节容量。
2. 现代版本MySQL的varchar是否支持存储Unicode?是否需要选其他数据类型?
只要将字段/表的字符集设置为支持全量Unicode的编码(最常用的是utf8mb4),varchar完全可以存储所有Unicode字符,包括中文、小语种文字、emoji、生僻字等,不需要选择其他额外的数据类型。
注意不要使用MySQL自带的阉割版
utf8字符集,它最多仅支持3字节的Unicode字符,无法存储emoji和部分生僻字,统一使用utf8mb4即可覆盖所有Unicode场景。
3. 使用varchar存储Unicode时,是否需要考虑单字符占用空间超过1字节的情况?
需要分场景判断:
- 字符计数场景不需要:因为N的统计单位是字符,例如
varchar(20)最多可以存20个中文,和每个中文占3字节还是4字节没有关系,不用做额外换算。 - 单行存储上限场景需要:MySQL单行数据的最大存储长度为65535字节(TEXT、BLOB类型不纳入该统计),varchar的实际存储占用为「实际存储的字符数 × 单字符最大占用字节数 + 1/2字节的长度记录位」,如果使用
utf8mb4编码(单字符最大占4字节),那varchar(N)的N理论最大值约为16383,如果定义的N过大,可能触发单行长度超限报错。 - 索引创建场景需要:InnoDB引擎的单列索引默认最大长度为767字节,如果给
utf8mb4编码的varchar(255)字段加普通索引,255*4=1020字节会超出默认限制,要么调整索引前缀长度,要么开启innodb_large_prefix参数支持最大3072字节的索引。
内容的提问来源于stack exchange,提问作者Nethrenial
相关产品推荐
相关产品推荐

