(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类型查询效率高
这是由他们在磁盘上存放的不同形式决定的,我们先来看一个图:
我们可以看到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类型适合存储经常更新的字符串列