关于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不会存在这个问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)