CHAR 是定长,VARCHAR 是变长,这是两者唯一的根本区别。
CHAR(n) 不管实际存几个字符,都固定占用 n 个字符的位置,长度不够时会在末尾用空格补齐;在检索取值时,MySQL 会把尾部空格去掉。n 最大为 255。适合长度基本固定的字段,比如手机号、省份编码、MD5 值。
VARCHAR(n) 只占用实际字符数,再加 1 到 2 字节的长度前缀,用来记录实际长度;当长度不超过 255 字节时用 1 字节,超过则用 2 字节。这里的 n 是最大字符数,不是字节数。理论上限 65535 字节,实际还受单行大小限制。适合长度差别很大的字段,比如昵称、地址、标题。
建表时的选择原则是:长度固定就用 CHAR,其余一律用 VARCHAR,不要为了方便而全表使用 CHAR。
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
phone CHAR(11) NOT NULL, -- 固定 11 位,用 CHAR
nickname VARCHAR(30) NOT NULL, -- 长度不定,用 VARCHAR
intro VARCHAR(200) DEFAULT '' -- 长短差别大,用 VARCHAR
);
有一点需要注意:VARCHAR 会保留末尾的空格,CHAR 不会。