1、varchar和char的区别

1. 区别1:定长和变长
在MySQL中,char和varchar都是用来存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型。
char有固定的的长度,所以在处理速度上要比varchar快很多,但是也相对更耗费存储空间,在速度上有要求的可以使用char类型。

  • char类型是规定多少字长则必须存储多少字长,超过的字段则只能截取出对应的长度进行存储,相对于要去字长长度不够的字段则用空格补齐。
  • varchar类型则是只要在规定字长之内,有多少就存多少,无需补齐;超出部分和char一样,舍去即可。(由prefix实现)

2. 区别2:存储容量不同

  • 对于char类型来说,最多只能存放的字符个数为255,和编码无关。
  • varchar最多能存放65532个字符,varchar的最大有效长度由最大行大小和使用的字符集来确定,整体最大长度是65532个字符。

2、varchar(1)占用几个字节

在version4之前,MySQL中varchar长度是按字节;而version5之后,按字符。如varchar(6),在version4,表示占用6个字节,而在version5中,表示占用6个字符。
而字符和字节的换算,则与编码方式有关,不同的字符所占的字节是不同的:

  • ASCII码:
    一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。

  • UTF-8编码:
    一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

  • Unicode编码: 一个英文等于两个字节,一个中文(含繁体)等于两个字节。


3、char和varchar对比

基于mysql5.0以上版本而言,也就是char和varchar括号内指定的都是最大字符数时,char和varchar对比表如下:

行为char字段varchar字段
最大长度255字符括号中最大的字符数通过编码来算,不超过行65535个字节
是否定长定长,不足的部分用隐藏空格填充不定长,保留实际字符
空间使用可能浪费更加节省
查找效率
尾部空格插入时省略插入时不会省略,查找时可省略
like查找语句中like后的’ '不会省语句中like后的’ '不会省,字段结尾的空格也不会省

4、详细介绍

1. varchar类型

varchar类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型更节省空间,因为它仅使用必要的空间(例如,越短的字符串使用越少的空间)。有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储,这会很浪费空间。

varchar需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。假设采用latin1字符集,一个varchar(10)的列需要11个字节的存储空间。varchar(1000)的列则需要1002个字节,因为需要2个字节存储长度信息。

varchar节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。其他一些存储引擎也许从不在原数据位置更新数据。

下面这些情况下适用varchar是合适的:

  • 字符串列的最大长度比平均长度大很多
  • 列的更新很少,所以碎片不是问题
  • 使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储

2. char类型
char类型是定长的:MySQL总是根据定义的字符串长度分配足够的空间。当存储char值时,MySQL会删除所有的末尾空格。char值会根据需要采用空格进行填充以方便比较。

char适合存储很短的字符串,或者所有值都接近同一个长度。例如,char非常适合存储密码的MD5值,因为这是一个定长的值。对于经常变更的数据,char也比varchar更好,因为定长的char类型不容易产生碎片。对于非常短的列,char比varchar在存储空间上也更有效率。例如用char(1)来存储只有Y和N的值,如果采用单字节字符集只需要一个字节,但是varchar(1)却需要两个字节,因为还有一个记录长度的额外字节。


参考资料:
[1] https://blog.csdn.net/weixin_42570248/article/details/89786882
[2] https://blog.csdn.net/weixin_46053707/article/details/110916066

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐