创建表时报错:
> 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
> 时间: 0.43s
● MySQL Server最多只允许4096个字段
● InnoDB 最多只能有1000个字段
● 字段长度加起来如果超过65535,MySQL server层就会拒绝创建表
● 字段长度加起来(根据溢出页指针来计算字段长度,大于40的,溢出,只算40个字节)如果超过8126,InnoDB拒绝创建表
● 表结构中根据Innodb的ROW_FORMAT的存储格式确定行内保留的字节数(20 VS 768),最终确定一行数据是否小于8126,如果大于8126,报错。
MySQL官方手册就可以查询到, 对于一行记录最大的限制是65535字节。为什么是65535?规定一行数据里面字段长度定义有64k;
有了65535的限制以后还有一个8126的限制是为什么呢?
MySQL是分两层的,MySQL Server层 + 存储引擎层。
第2个问题其实是MySQL除了在Server层做了一次限制还会在Innodb存储引擎层在做一次限制。
innodb为了保证B+TREE是一个平衡树结构,强制要求一条记录的大小不能超过一个页大小的一半。这也就是我们上面看到的第二个错误。
下面是innodb B+树的结构,我们可以想象一下二分查找时,一个页的只有一条数据会是什么样子?