在数据库中,CHAR
和 VARCHAR
是两种用于存储字符串的数据类型,它们之间有以下区别:
存储方式:
CHAR
:固定长度的字符类型。它会在存储数据时,将字符串填充到指定长度,并在末尾补足空格字符,以保证达到指定长度。VARCHAR
:可变长度的字符类型。它会根据存储的实际数据长度来分配存储空间,不会浪费额外的空间用于填充。char
最大长度是255字符,varchar
最大长度是65535个字节。
存储空间:
CHAR
:由于存储的是固定长度的字符串,所以它的存储空间是固定的。例如,如果定义一个长度为 10 的CHAR
字段,那么无论实际存储的字符串长度是多少,它都会占用 10 个字符的存储空间。VARCHAR
:存储的实际数据长度会影响它所占用的存储空间。例如,如果定义一个长度为 10 的VARCHAR
字段,而实际存储的字符串长度只有 5 个字符,那么它只会占用 5 个字符的存储空间,而不会浪费额外的空间。
性能和存取:
- 由于
CHAR
类型的数据是固定长度的,因此在存取时速度可能会比较快,特别是当存储的字符串长度固定且较长时。 VARCHAR
类型的数据由于存储的是实际长度,因此在存取时可能会稍慢一些,特别是当存储的字符串长度不固定或者变化较大时。
- 由于
这是由他们在磁盘上存放的不同形式决定的,我们先来看一个图:
我们可以看到
char
类型在存放数据的时候,中间是没有间隔的,数据本身是有空格的
,但是数据段之间没有间隔,因为我们在创建列的时候已经告诉MySQL列的长度了,MySQL在查询数据的时候,只需要按部就班寻找就行了,不需要在中途计算这个数据段的长度。
但是varchar
类型的存放就不同了,在每个数据段开头
,都要有一段空间(1~2个字节)
存放数据段的长度,在数据段的结尾
还有一段空间(1个字节)
标记此字段的节数。MySQL在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节。所以MySQL在遍历数据的时候,磁针要比char类型的列多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因了。
- 适用场景:
CHAR
适合存储长度固定的字符串,例如性别、国家代码等。VARCHAR
适合存储长度不固定的字符串,例如姓名、地址等。- 存储很短的信息,比如门牌号码101,201……这样很短的信息应该用
char
,因为varchar还要占1个byte用于存储信息长度,本来打算节约存储的现在得不偿失。 - 固定长度的。比如使用
uuid作为主键
,那用char
应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占1个长度信息。 - 十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
总的来说,如果你知道数据的长度是固定的,可以考虑使用 CHAR
类型;如果数据的长度是不确定的或者变化较大,可以考虑使用 VARCHAR
类型。