数据库:char , varchar 和varchar2的使用区别

1.定长和不定长

①char(M) 类型,每个值都占用 M 个字符,如果某个值小于M,mysql就会在它的右边用空格补足,在检索操作中,那些补足的空格将被去掉;

②varchar(M) 类型,每个值刚好占用够用的字节,再加上一个用来记录其长度的字节(即总长度为L+1字节)

2.存储效率比较

对计算机来说,char是定长的,处理的时候,只需要将右边的空格去掉即可,

而 varchar ,最后一个字符还是记录的字符长度,计算机处理的时候,还要计算最后这个字符,所以有额外的计算

相比较之下,char的存储效率比varchar要高;

数据库:char , varchar 和varchar2的使用区别_第1张图片

 

我们可以看到char类型在存放数据的时候,中间是没有间隔的,数据本身是有空格的,但是数据段之间没有间隔,因为我们在创建列的时候已经告诉MySQL列的长度了,MySQL在查询数据的时候,只需要按部就班寻找就行了,不需要在中途计算这个数据段的长度。

但是varchar类型的存放就不同了,在每个数据段开头,都要有一段空间(1~2个字节)存放数据段的长度,在数据段的结尾还有一段空间(1个字节)标记此字段的节数。MySQL在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节。所以MySQL在遍历数据的时候,磁针要比char类型的列多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因了。

 

3.适用的场景

char

①存储很短的信息:char是固定长度,所以存储效率高,如果字符比较短,又对效率有要求的字符

eg:门牌号101,102….:因为如果使用varchar,还得多上一个字符来记录字符长度,不节约空间;

②确定长度的字段:eg:如果使用uuid来作为主键,因为uuid的长度是固定的,那使用varchar可变长的特性就消失了,而且varchar还得多出一个字符来记录长度,此时char即省空间,又提高效率;

③十分频繁改变的列:如果一个列改动很频繁,尤其是大批量的改动,那么被改动的每一个值在改动的时候还需要额外的计算字符的长度,对于海量的数据是非常耗费计算时间的,但是char就可以直接改动,可以节约一步计算,可以省去不少时间,提高效率;

 

总的来说:char定长,耗费空间,但是存储效率优于 varchar

4.varchar和varchar2的区别

背景:

varchar的sql标准类型,所有的数据库都支持;

Varchar2 是oracle 提供的特有的数据类型,别的数据库不一定支持;

使用:

①如果牵涉到数据库的移植,比如从oracle移植到mysql之类的,那建议使用varchar,如果确定只用oracle,那可以使用varchar2

②varchar把空字符串当作空字符串来处理,varchar2把空字符串当作null处理;

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