首先,char 类型和 varchar 类型都是存储字符或字符串的字段类型。

1.区别:

char 存储的列是固定长度的,比如 char(5) 的列就是固定五个字符,如果插入的内容少于 5 个字符,则用空格填充。

而 varchar 存储的列不固定长度,varchar(5) 表示最多某行一列的值占 五个字符。

2.细节补充:

一、虽然 char 当插入少于固定长度时,会补充空格。但在查询时,mysql 会自动 trim() 结果,所以查询时是 trim 后的结果。

比如 insert "a " (a + 空格),但插入后查询出来仍然是 "a"

二、char() 的列虽是固定字符长度,但字节长度却不固定。

比如:

create table table1(a char(5)) charset=utf8 engine = innoDB;
insert into table1 values('12345');     // 五个字节
insert into table1 values('举头望明月');   // 十五个字节
select length(a) from table1 limit 10;   // 5 15

create table table2(a char(5)) charset=gbk engine = innoDB;
insert into table2 values('12345');     // 五个字节
insert into table2 values('举头望明月');   // 十个字节
select length(a) from table2 limit 10;   // 5 10

三、varchar 超出定义的长度时,再插入,结果怎样?

如果当前 mysql 服务端开启了严格模式(strict_mode),则插入会失败。

如果当前 mysql 没有开启严格模式,则会将插入部分超出长度的部分(左起)舍弃掉,只存储定义的长度的部分。