主要区别
char和varchar都是用于在数据库中存储字符串的数据类型。它们之间的主要区别在于存储空间的使用方式。
- char是一种定长的数据类型,它的长度固定且在存储时会自动在结尾添加空格来将字符串填满指定的长度。char的长度范围是0-255
- varchar是一种可变长度的数据类型,它只会存储实际的字符串内容,不会填充空格。因此,在存储短字符串时,varchar可以节省空间。varchar的长度范围是0-65535 (MySQL 5.0.3之后的版本)
具体区别
列类型 | 存储方式 |
存储空间 | 性能 | 默认填充 |
CHAR | 固定长度的字符类型 | 对于CHAR(n) ,n表示字符的最大长度。无论实际存储的内容长度是多少,都会占用n个字符长度的存储空间。 |
由于固定长度,读取和存储时速度相对较快。但是,使用CHAR 会浪费存储空间,尤其是对于存储长度不确定的数据。 |
如果存储的字符串长度小于定义的长度,将使用空格进行右填充,使其达到指定长度。 |
VARCHAR | 可变长度的字符类型 | 对于VARCHAR(n) ,n表示字符的最大长度。实际存储的内容长度加上1或2个字节的开销(取决于字符集)。 |
由于可变长度,读取和存储时需要动态分配存储空间,稍微慢一些。但是,VARCHAR 适用于存储长度不确定的数据,可以节省存储空间。 |
不会进行填充,实际存储的长度与字符串长度一致。 |
如果使用char(100),则插入记录后就分配了100个字节,后续修改不会造成页分裂的问题,而varchar(100)由于没有提前分配存储空间,因为表中数据刚开始插入时,可变长度字段值都是根据实际长度存储下来的,且行与行之间数据也是紧密连续存放在文件地址中的。那么现在值变长了,原来的位置无法扩展出新的空间出来,所以无法覆盖存放到原来的位置上。此时MySQL就会使用页分裂的方法展字段变长的空间。
场景举例
列类型 | 举例 |
CHAR | 性别(1位),手机号(11位),身份证号(18位)、订单号(固定长度) |
VARCHAR | 产品描述 (可变长度) 、存储用户地址 (可变长度) 、存储用户名称 (可变长度) |
优缺点
列类型 | 优点 | 缺点 |
CHAR | 固定长的字符串类型,减少内存碎片,并且无需额外的磁盘空间去存储长度信息 | 会删除末尾的空格信息,例如一个char(8)存储 "mijiu "和 “mijiu”他会丢失前者末尾的空格信息,两者存储的都是 “mijiu ” |
VARCHAR | 可变长的字符串类型,兼容性更好 | 可能会产生内存碎片、varchar会额外需要1到2个字节存储长度信息、以及update语句可能会导致页分裂等 |