【Mysql】varchar类型

1.varchar类型

(1)varchar (N):中的N指的是字符的长度,即:该字段最多能存储多少个字符(characters),不是字节数。无论是一个中英文字符或者数字、或者一个汉字,都当作一个字符。
【 a,我,1 都是一个字符,可是a和1是一个字节,‘我’(utf8下)是3个字节。 utf8mb4下:汉字也是3个字节,表情符号是4个字节 】
(2)varchar 最多能存储 65535 个字节的数据。
65535 = 全部字段的长度 + 变长字符的长度标识 + NULL标识位
变长字符的长度标识:用1到2个字节表示实际长度(长度 >255 时,须要2个字节; <255 时,须要1个字节)
NULL标识位:varchar字段定义中带有 default null 容许列空,则须要 1 bit 来标识,每 8 个bits的标识组成一个字段。一张表中存在N个varchar字段,那么须要(N+7)/8 (取整)bytes存储全部的NULL标识位。mysql

(3)虽然InnoDB内部支持 varchar 65535 字节的行大小,可是MySQL自己对全部列的合并大小施加了 65535 字节的行大小限制。详情见例子sql

2.varchar 长度的编编限制:

字符类型若为gbk,每一个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每一个字符最多占3个字节,最大长度不能超过21845。
字符类型若为utf8mb4,每一个字符最多占4个字节,最大长度不能超过16283。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。编码

3.例子

若一个表定义为
create table t4(c int, c2 char(30), c3 varchar(N)) 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。
若是被varchar超过上述的b规则,被强转成text类型,则每一个字段占用定义长度为11字节,固然这已经不是“varchar”了。code

mysql> alter table t4 modify column c3  varchar(21813);
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
相关文章
相关标签/搜索