MySQL中VARCHAR
类型的最大长度取决于多个因素,包括字符集、存储引擎以及行大小的限制。以下是详细总结:
1. 基本规则
最大字节限制:单列
VARCHAR
的最大存储空间为 65,535字节(所有字段的总行大小也受此限制)。长度标识开销:
VARCHAR
需要额外1或2字节存储长度信息。若长度 ≤255字符,用1字节;若长度 >255字符,用2字节。因此,实际可用字节为 65,535 - 2 = 65,533字节(假设需要2字节长度标识)。
2. 字符集影响
不同字符集下,单个字符占用的字节数不同,导致最大字符数不同:
latin1(单字节字符):
最大字符数 = (65,535 - 2) / 1 = 65,533字符。
utf8(最多3字节/字符):
最大字符数 = (65,535 - 2) / 3 ≈ 21,844字符。
utf8mb4(最多4字节/字符,支持如表情符号):
最大字符数 = (65,535 - 2) / 4 = 16,383字符。
3. 行大小限制
所有字段的总存储空间(含长度标识)不得超过 65,535字节。若表中有其他字段,需减少
VARCHAR
长度。示例:若使用
latin1
且有两个VARCHAR
字段,每个字段最大长度为 32,765字符(总和为32,765×2 + 2×2 = 65,534字节)。
4. 存储引擎差异
InnoDB:默认行大小限制为 65,535字节。使用
DYNAMIC
或COMPRESSED
行格式时,若启用innodb_large_prefix
(MySQL 5.7+默认开启),可支持更大索引前缀(但单列VARCHAR
最大仍受上述限制)。MyISAM:同样遵循65,535字节行限制。
5. 版本差异
MySQL < 5.0.3:
VARCHAR
最大长度为 255字符。MySQL ≥ 5.0.3:支持最大 65,535字节(需考虑字符集)。
示例代码
sql
复制
-- latin1字符集,单列最大长度 CREATE TABLE example_latin1 ( data VARCHAR(65533) CHARSET latin1 ) ENGINE=InnoDB; -- utf8mb4字符集,单列最大长度 CREATE TABLE example_utf8mb4 ( data VARCHAR(16383) CHARSET utf8mb4 ) ENGINE=InnoDB;复制
总结
最大字符数 = (65,535 - 2) / [字符集每字符最大字节数]。
常见字符集下的最大值:
latin1: 65,533字符
utf8: 21,844字符
utf8mb4: 16,383字符
需确保总行大小不超过65,535字节,并考虑存储引擎及行格式的额外限制。