mysql通过行记录怎么判断某个列是否发生了溢出

在mysql中,一行记录数据如果过大,为了满足一个页最少存2条记录,某些列可能会发生溢出

比如有个表t

create table t(c1 varchar(10000) not null) row_format compact;

我向这张表中插入一行数据

insert into t values(repeat('a', 10000));

按照mysql的默认配置,这时c1列就会发生溢出,mysql用一个页来存这个字段768个字节的前缀以及20个字节来记录溢出页的一些信息。

我的问题是,从mysql的记录格式有没有一个标识,说明c1列发生了溢出,这788个字节要按照有溢出的情况来解析。如果没有这么一个标识,mysql是怎么判断某一列发生了溢出?毕竟如果一个页没有发生溢出,也可能刚好这个字段的长度也是788个,比如我插入下面这一条数据应该是不会发生溢出的

insert into t values(repeat('a', 788));
最佳答案

变长字段中存了,如果存的是repeat(‘a’, 10000),那么ibd文件中该字段的长度为c314,如果存的是repeat(‘a’, 788),那么ibd文件中该字段的长度为8314,16进制的314为788,innodb中int类型数字第一个bit固定为1,因此c314可以理解为4314,8314可以理解为0314,这就是区别,相当于长度中的第二个bit位记录了当前字段是否溢出,同时也可以在源码中得到证明

MySQL

4个月前 评论
讨论数量: 3

mysql存多少就是存的多少,只有取的时候有溢出会舍去溢出部分。判断就取出数据看长度是不是跟预期的一样

4个月前 评论

mysql中,一条记录结构,变长列有一个长度字段来记录一个列实际的长度,取数据也是依赖这个字段吧

4个月前 评论

变长字段中存了,如果存的是repeat(‘a’, 10000),那么ibd文件中该字段的长度为c314,如果存的是repeat(‘a’, 788),那么ibd文件中该字段的长度为8314,16进制的314为788,innodb中int类型数字第一个bit固定为1,因此c314可以理解为4314,8314可以理解为0314,这就是区别,相当于长度中的第二个bit位记录了当前字段是否溢出,同时也可以在源码中得到证明

MySQL

4个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!