(1) varchar与char的区别

       char是一种固定长度的类型,varchar则是一种可变长度的类型

varchar(50)中50的涵义

       最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)

       其实,CHAR的长度是固定的,而VARCHAR2的长度是可以变化的,比如,存储字符串“abc”,对于CHAR(10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2(10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度储存。CHAR(10)若输入数据的字符小于10,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其中超出部分。VARCHAR(10)数据类型的存储长度为实际数值长度。

       所以,在列容量不能充分利用的情况下使用char会造成一定的空间浪费。

 

 

 (2) int(20)中20的涵义

       是指显示字符的长度

       但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0

       20表示最大显示宽度为20,但仍占4字节存储,存储范围不变;

mysql为什么这么设计

       对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样;

 

为什么char类型查询效率高

这是由他们在磁盘上存放的不同形式决定的,我们先来看一个图:

mysql varchar500能存放多少字符 varchar50能存多少个字符_char

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

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

 

如何选择VARCHAR与CHAR类型?

    Varchar类型的存储特点

        Varchar用于存储变长字符串,只占用必要的存储空间

        列的最大长度小于255则只占用一个额外字节用于记录字符串长度

        列的最大长度大于255则要占用两个额外字节用于记录字符串长度

    varchar的适用场景

        字符串列的最大长度比平均长度大很多

        字符串列很少被更新

        使用了多字节字符集存储字符串

    Char类型的存储特点

        Char类型是定长的

        字符串存储在char类型的列中会删除末尾的空格

        Char类型的最大宽度为255

    Char类型的适用场景

        Char类型是个存储所长度近似的值

        Char类型使用存储短字符串

        Char类型适合存储经常更新的字符串列