题目
char 和 varchar 的区别,哪个索引效率更高?
答案
**长度不同**:
- char 使用指定长度的**固定长度**表示字符串的一种字段类型;比如char(8),则数据库会使用固定的 1 个字节(八位)来存储数据,不足 8 位的字符串**在其后补空字符**,**读取的时候会默认截断掉末尾的空字符**。char 一般用来保存固定长度的表单提交数据存储,例如:身份证号,手机号,电话,密码等
- varchar(M) 是一种比 char 更加灵活的数据类型,同样用于表示字符数据,但是 varchar 可以保存**可变长度**的字符串。其中 M 代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。因此,对于那些难以估计确切长度的数据对象来说,使用 varchar 数据类型更加明智。
MySQL4.1 以前,varchar数据类型所支持的最大长度 255,5.0 以上版本支持 65535 字节长度,utf8 编码下最多支持 21843个字符(不为空)
varchar 除了会保存需要的字符数,还**另加一个字节来记录长度** (如果列声明的长度超过 255,则使用两个字节记录长度)
**数据页分裂问题**:
- varchar 因为行是变长的,在 UPDATE 时可能使行变得比原来更长,这可能会导致该行原本所处的页面已经没有更多的空间存储了,这种情况下 InnoDB 则需要进行页分裂使得该行可以放进页内
- 而 char 就不会出现这种页分裂、页空隙(碎片)问题
