Mysql中varchar和char区别

2023-03-14,,

一、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

Mysql中varchar和char区别的相关教程结束。

《Mysql中varchar和char区别.doc》

下载本文的Word格式文档,以方便收藏与打印。