Mysql中char和varchar的区别详细剖析

一、区别

1、最大长度:

char最大长度是255个字符,varchar最大长度是65535个字符。

2、定长:

char是定长的,不足的部分会用隐藏空格填充,varchar是不定长的。
当向char中插入数据时,如果该数据小于定义的长度,那么就会用空格填充不足的部分;
当向varchar中插入数据时,如果数据小于定义的长度,那么按数据的实际长度存储,即插入多长就存多长;当要存储的数据的实际长度大于定义的长度时,会对该数据进行自动截取。也就是说varchar的动态存储体现在存储数据的实际长度小于所给它定义的长度时。

3、空间使用:

char会浪费空间,varchar会更加节省空间。

4、查找效率:

char查找效率会很高,varchar查找效率会更低。
因为char的长度固定,故char的存取速度还是要比varchar快得多,存储与查找会更加方便;但是char也为此付出了空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,是以时间换空间,存储与查找相比于char效率更低一些。

5、尾部空格:

char插入时可省略,vaechar插入时不会省略,但查找时省略。

二、char比varchar查询效率更快以及比varchar更浪费空间的原因

这是由他们在磁盘上存放的不同形式决定的,我们先来看一个图:
Mysql中char和varchar的区别详细剖析_第1张图片
从图中我们可以明显发现存储相同的数据,char类型会比varchar类型更耗费空间。
char类型在存放数据的时候,中间是没有间隔的,数据本身是有空格的,但是数据段之间是没有间隔的,这是因为我们在创建列的时候已经告诉MySQL列的长度了,MySQL在查询数据的时候,只需要按部就班寻找就行了,不需要在中途计算这个数据段的长度。
但是varchar类型的存放就不同了,它是动态分配存储空间的,在每个数据段开头,都要有一段空间来(1~2个字节)存放数据段的长度信息,在数据段的结尾也还有一段空间(1个字节)标记此字段的节数。MySQL在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节,也只分配3个字节的存储空间。所以MySQL在遍历数据的时候,磁针要比char类型的列,多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因了。

三、常用场景

一,存储非常非常短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占1个byte用于存储信息长度,本来varchar是用来节约存储空间的,但现在得不偿失。

二,固定长度的。更适合用char,比如使用uuid作为主键,那用char应该更合适。因为他固定长度,此时varchar动态根据长度的特性就相当于没有了,而且还要占1个长度信息。

三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要耗费很多的精力用于计算,而这些对于char来说是不需要的,所以这种场景下更适合用varchar。

你可能感兴趣的:(数据库,mysql,数据库,java)