char和varchar的区别

Posted fengg123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了char和varchar的区别相关的知识,希望对你有一定的参考价值。

作为使用次数最多的数据类型,char和varchar都可以存储字符串,主要在存储和读取方式上存在一些差异。

一、声明

char和varchar在声明时需要加上长度,如char(30)或varchar(30),表示列最多能存储30个字符(不涉及字节数的计算,一个字母和一个汉字都占一个字符)。

二、存储方式

char和varchar分别是定长类型和不定长类型。例如char(10)类型,无论是空字符串还是不足长字符串,都会在右边补足空格,直到存储的字符串长度为10;而varchar(10)类型,则会存储不大于10个字符的字符串,且不会在右侧补充空格。

注意:若原字符串右侧就有空格,使用char存储后读取时会去掉右侧所有空格(PAD_CHAR_TO_FULL_LENGTH未启用时),导致原始数据和读取的数据不相等。所以char适合存储固定长度且右侧不会出现空格的字符串,如手机号、身份证号等。

 

那么char和varchar在存储数据时做了什么才导致这种差异呢?首先,mysql的行长度范围是0~65535(2^16-1)个字节,由表内所有列共用,若数据类型的行长超过65535字节,则会报错:

技术图片

而varchar的长度受到其他列长和编码类型的限制。若使用MySQL8.0默认的utf8mb4编码方式(编码方式为utf8,每个字符最多使用4 bytes,汉字使用3 bytes),可算出varchar存储的字符串能达到的最大长度是(65535 - 2) / 4 = 16383余1 byte。

技术图片

为了实现变长存储,varchar在每个值前面都会使用1~2 bytes来标注字段值占用的byte长度。若存储值的占用不超过255 bytes,前面会加上1 byte,反之会使用2 bytes。(即使是空字符串也会占用1 byte)

而InnoDB下的char固定只能存储最多255个字符,且当字段大于或等于768 bytes长度时会自动转换为可变长度字段,并可以存储到页外。如utf8mb4编码的varchar(255),字段长度为4 * 255 = 1020 > 768,就会以不定长方式存储字段;而MySQL5.7的默认格式为utf8,单字符最多使用3 bytes,字段长度为3 * 255 = 765 < 768,才会以定长方式存储字段值。可以算出,utf8mb4最多只能以定长方式存储191个字符,即 768 / 4 = 192再减1个字符。

 

三、其他存储类型

简单介绍下其他的字符串存储类型:

binary和varbinary:和char与varchar的区别类似,只是这两个用来存储二进制字符串,而且在binary字段类型插入字符串时,会自动在最后添加\\0结尾。

blob和text:分别存储二进制字符串大数据和文本字符串大数据,按可容纳的数据大小分为tinyblob、blob、mediumblob和largeblob四种类型,字符串text也是一样。并且为这两种数据创建索引时,必须指定索引前缀长度(如INDEX(blob_col(10))。

四、总结

char类型在较短定长的情况下效率会高一点,以空间换时间,但是需要考虑的条件较多。InnoDB下建议使用varchar代替char。

以上是关于char和varchar的区别的主要内容,如果未能解决你的问题,请参考以下文章

char和varchar区别

char和varchar的区别

Char和VarChar有啥区别[重复]

sqlplus 中 varchar(10) 和 varchar ( 10 char) 的区别

实体框架代码优先 MaxLength 和 FixedLegth(char 与 varchar)

char和varchar的区别