mysql中varchar和char_Mysql中varchar和char区别

一、varchar和char的区别:

区别一:定长和变长

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

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

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

区别二:存储容量不同

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

varchar最多能存放65532个字符。VARCHAR的最大有效长度由最大行大小和使用的字符集来确定。整体最大长度是65,532字节。

二、 在Mysql中用来判断是否需要进行对据列类型转换的规则

在一个数据列表里,如果每个数据列的长度都是固定的,那么每个数据列的宽度也是固定的。

只要数据列表里有一个数据列的长度可变,那么个数据列的长度都是可变的。

如果某个数据表里的某个数据行的长度是可变的,那么为了节约时间,Mysql会把这个数据库里的固定长度类型转换为可变长度类型。但是长度小于4的char类型不会转换为varchar类型。

三、 Mysql中varchar的最大长度为多少?(这不是一个固定的数字)

1. 限制规则

存储限制

varchar字段是将实际内容存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535字符。

编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为UTF8,每个字符最多占3字节,最大长度不能超过21845;

若定义的时候超过上述限制,则varchar会被强制转换为text类型,并产生warning。

行长度限制

导致实际运用中varchar长度限制的是一个行定义的长度。Mysql要求一个行的定义长度不能超过65535bytes,若定义的表长度超过这个值,则提示:

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

由字符集来确定,字符集分单字节和多字节

Latin1 一个字符占一个字节,最多能存放65532个字符

GBK 一个字符占两个字节, 最多能存32766个字符

UTF8 一个字符占三个字节, 最多能存21844个字符

注意,char 和 varchar 后面的长度表示的是字符的个数,而不是字节数。

2. 计算例子

若一个表只有一个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;则此处的最大值为(65535-1-2-4-30*3)/3=21812

减1与减2原因与上述例子相同

减4的原因是int类型的c占4个字节;

减30*3的原因是char(30)占用90个字节,编码是UTF8。

如果被varchar超过上述的b规则,则被强转为text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。

则此处N的最大值为(65535-1-2-4-30*3)/3=21812

create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值