MySQL中varchar和char的区别以及和text的关系

MySQL中varchar和char的区别以及和text的关系,第1张

关于varchar(n)

n表示什么?

MySQL5.0.3之前varchar(n)这里的n表示字节数

MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是英文还是中文都可以存放200个

varchar最大长度可以是多少?

MySQL要求一个行定义长度不能超过65535个字节,不包括text、blob等大字段类型,varchar长度受此长度限制,和其他非大字段加起来不能超过65535个字节,超过以上限制则会报错。


若超过这个限制,则会自动将varchar类型转为 mediumtext 或 longtext,并产生warning。


varchar(n)能存储多少字符,每个字符占用几个字节?

varchar(n)占用几个字节,能存储的字符跟字符集有关系:

  • 字符类型若为gbk,每个字符占用2个字节
    最大存储字符不能超过(65535-1-2) / 2=32766 个字符
    减1的原因是实际行存储从第二个字节开始;
    减2的原因是varchar头部的两个字节表示长度(超过255个字节会有2字节的额外占用空间开销,所以减2,如果是255以下,则减1);
    除2的原因是字符编码是gbk
  • 字符类型若为utf8,每个字符最多占用3个字节
    最大存储字符不能超过(65535-1-2) / 3=21844 个字符
  • 字符类型若为utf-8mb4,每个个字符占用4个字节
    最大存储字符不能超过(65535-1-2) / 4=16383 个字符

varchar和char的区别

区别一:定长和变长

char表示定长、长度固定,varchanr表示变长,即长度可变。


即char类型是规定多少字长则必须存储多少字长,超过的长度的字段则只能截取出对应的长度进行存储,相对于要求字长长度不够的字段则用空格补齐。



而varchar类型则是只要在规定字长之内,有多少存多少,无需补齐;超出的部分和char一样,舍去即可。


(由perfix来实现)

区别二:存储容量不同

对于char类型来说,最多只能存放的字符个数为255,和编码无关。



varchar最多能存放65532个字符。


VARCHAR的最大有效长度由最大行大小和使用的字符集来确定。


varchar和text的关系和区别

在大多数情况下,我们可以把text视为varchar字段,但是这两个字段类型在存储字符大小上有一些区别:
varchar在mysql中必须满足最大行宽度限制,也就是 65535(64k)字节,而varchar本身是按字符串个数来定义的,在mysql中使用uft-8字符集一个字符占用三个字节,所以单表varchar实际占用最大长度如下:

若一个表只有一个varchar类型。


其定义为create table t4(c varchar(N)) charset=gbk;
则此处N的最大值为(65535-1-2)/2=32766个字符。



减1的原因是实际行存储从第二个字节开始;
减2的原因是varchar头部的两个字节表示长度;
除2的原因是字符编码是gbk

若一个表定义为create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
则此处N的最大值为(65535-1-2-4-30*3)/3=21812
减1与减2原因与上述例子相同
减4的原因是int类型的c占4个字节;
减(30 *3)的原因是char(30)占用90个字节,编码是UTF8。


如果被varchar超过上述的最大行宽度限制,则被强转为text类型。


除此之外,二者还有以下的区别

  • 当text作为索引的时候,必须 制定索引的长度,而当varchar充当索引的时候,可以不用指明。


  • text列不允许拥有默认值

  • 当text列的内容很多的时候,text列的内容会保留一个指针在记录中,这个指针指向了磁盘中的一块区域,当对这个表进行select *的时候,会从磁盘中读取text的值,影响查询的性能,而varchar不会存在这个问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/589673.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-13
下一篇 2022-04-13

发表评论

登录后才能评论

评论列表(0条)

保存