MySql varchar 的最大长度


1. MySQL要求一个行的定义长度不能超过65535。

注意这里是一行,所有字段的长度加起来不能超过这么多

所谓单行最大限制指的就是一张表中所有字段的所设置的长度不得超过65535字节,

2. 长度计算方式
 varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度

(长度超过255时需要2个字节)
2.1 utf-8 的表
create table t4( c int, c2 char(30), c3 varchar(21812),c4 text) charset=utf8;

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


减1的原因是实际行存储从第二个字节开始’;
减2的原因是varchar头部的2个字节表示长度;
减4的原因是int类型的c占4个字节;
减30*3的原因是char(30)占用90个字节,编码是utf8。
除以三也是因为utf8占用三个字节
N=21812 也是这个varchar能用的最大长度,超过这个长度就会报错
2.2 gbk的表
create table t4(c varchar(N)) charset=gbk;

则此处N的最大值为(65535-1-2)/2= 32766。

减1的原因是实际行存储从第二个字节开始’;

减2的原因是varchar头部的2个字节表示长度;

除2的原因是字符编码是gbk。
2.4 TEXT 字段包含在65535里面吗

更改列以TEXT 避免65,535字节的行大小限制并允许操作成功,因为 BLOB并且 TEXT列仅向行大小贡献9到12个字节。

BLOBTEXT列只对行大小限制贡献9到12个字节,因为它们的内容与行的其余部分分开存储。

create table t1( c int, c2 char(30), c3 varchar(21812)   ) charset=utf8;
刚好65535 可以

create table t2( c int, c2 char(30), c3 varchar(21812)  ,c4 text ) charset=utf8;
添加text ,超过限制

create table t5( c int, c2 char(30), c3 varchar(21809) , c4 text  ) charset=utf8;
给text余留9个字节  可以

create table t6( c int, c2 char(30), c3 varchar(21810) , c4 text  ) charset=utf8;
给text余留8个字节  不可以
说明21812-21809 =3   3*3 =9 说明text最少要占用9个字节
而 21812-21810 =2    2*3 =6 不满足9个字节

create table t7( c int, c2 char(30), c3 varchar(21808) , c4 text ,aa varchar(1) ) charset=utf8;
可以

create table t8( c int, c2 char(30), c3 varchar(21808) , c4 text ,aa varchar(2) ) charset=utf8;
超过65535 ,说明text就是需要占用9个字节,并且不是需要*3 或者乘以2的
03-02 05:15