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

关于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不会存在这个问题。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bruin_du

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值