CHAR和VARCHAR

char和varchar类型相似,都用来存储字符串。但它们的保存和检索的方式不同。

区别一:定长和变长
char属于固定长度的字符串类型,varchar属于可变长度的字符串类型。
区别二:存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。而 varchar 呢,最多能存放 65,532 个字符。varchar 的最大有效长度由最大行大小和使用的字符集确定,整体最大长度是 65,532 字节,最大有效长度是 65532 字节,在 varchar 存字符串的时候,第一个字节是空的,不存任何的数据,然后还需要两个字节来存放字符串的长度。所以有效长度就是 65535 - 1 - 2= 65532
由字符集来确定,字符集分单字节和多字节
Latin1 一个字符占一个字节,最多能存放 65532 个字符
GBK 一个字符占两个字节, 最多能存 32766 个字符
UTF8 一个字符占三个字节, 最多能存 21844 个字符
注意,char 和 varchar 后面的长度表示的是字符的个数,而不是字节数。
两相比较,char 的效率高,没有碎片,尤其更新比较频繁的时候,方便数据文件指针的操作。但不够灵活,在实际使用时,应根据实际需求来选用合适的数据类型。
区别三:处理速度不同
由于char是固定长度,所以处理速度比varchar快,但是其缺点是浪费存储空间,程序需要对行位空格进行处理,所以对于那些长度变化不大并且对查询速度有较高要求的数据优先考虑使用char类型来存储。

不同的存储引擎对于char和varchar的使用原则不同

-MyISAM存储引擎: 建议使用固定长度的数据列代替可变长度的数据列。
-MEMORY存储引擎:目前都使用固定长度的数据行存储,因此无论使用char或者varchar列都没有关系,两者都是作为char类型处理的。
-InnoDB存储引擎:建议使用varchar类型。对于InnoDB数据表,内部的行存储格式没有区分固定的长度和可变长度列,本质上,使用固定长度char列不一定比使用可变长度varchar列性能好。因而,主要的性能因素是数据行使用的存储总量。由于char平均占用的空间多余varchar,因此使用varchar来最小化需要处理的数据行的存储总量和I/O是比较好的。

你可能感兴趣的:(CHAR和VARCHAR)