一行中可以容纳多少字段长度?每个字段拥有长度又可以是多少?是否数据类型的限制长度固定不变?带着这几个问题,我们开始进行一系列研究。
一、行容纳的字段长度
众所周知,记录是以行的形式进行保存的,Mysql5.1以后,行的保存格式默认为Compact格式。行记录Compact格式为:
变长字段NULL标志位记录头信息列1数据列2数据列3数据...
第一个变长字段是记录这行的总字段长度,如果行记录的字段总长小于255字节,变长字段就占一个字节(一个字节有8位,8位的二进制最多能表示到255)。当大于255时,变长字段的长度就是两个字节。Mysql规定变成字段不超过两个字节,就意味着行的段总长最多不能超过65535个字节(两个字节有16位,16位最多能表示65535)mysql> create table test_limit (idvarchar(65531),name char(1) )charset=latin1;
Query OK, 0 rows affected (0.00 sec)
可以看出来65531+1=65532<=65532(65535-1-2, -1是因为一个字节不存数据,-2是因为两个字节varchar的长度)
mysql> create table test_limit (id varchar(65531),name char(2))charset=latin1;
ERROR 1118 (42000): Row size too large. Themaximum row size for the used table type, not counting BLOBs, is 65535. Thisincludes storage overhead, chec