首页 > 技术文章 > MySQL中char和varchar的区别?varchar(1)占用几个字节?

xiaozhengtongxue 2020-09-30 15:12 原文

背景

依然是面试官提的问题,做一个复盘。

char和varchar的区别

区别一:定长和变长

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

  • char类型是规定多少字长则必须存储多少字长,超过的字段则只能截取出对应的长度进行存储,相对于要去字长长度不够的字段则用空格补齐。
  • varchar类型则是只要在规定字长之内,有多少就存多少,无需补齐;超出部分和char一样,舍去即可。(由prefix实现)
区别二:存储容量不同
  • 对于char类型来说,最多只能存放的字符个数为255,和编码无关。
  • varchar最多能存放65532个字符,varchar的最大有效长度由最大行大小和使用的字符集来确定,整体最大长度是65532个字符。

varchar(1)占用几个字节

首先要考虑一下varchar的长度是按字节来算还是按字符来算。查阅了一下网上的答案:

也就是:
在version4之前,MySQL中varchar长度是按字节;而version5之后,按字符。如varchar(6),在version4,表示占用6个字节,而在version5中,表示占用6个字符。

而字符和字节的换算,则与编码方式有关,不同的字符所占的字节是不同的。:

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

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

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

推荐阅读