今天记录一个比较有意思的东西,看一下int类型的字段在.ibd文件中是怎么存的。
int类型是一种有符号类型,四个字节,所以在表示数据的时候只有后面的31位是有效位,最高值为2^31-1。那么如果字段值是1的话,.ibd文件中是不是存储的内容就是0x00000001了呢?下面看一个例子,首先建表并插入数据:
CREATE TABLE `ttt` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, `e` bigint(20) DEFAULT null, `f` varchar(20), PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`) ) ENGINE=InnoDB; insert into ttt values(null, -1, 1, 1, 'cccccc');
其在.ibd文件中的内容为:
06 /* 变长字段长度列表 */ 00 / * null 标志位 */ 00 00 18 FF C3 /* 记录头 */ 80 00 00 03 00 00 /* 事务id */ 00 00 06 1D C7 00 00 /* 回滚指针 */ 01 53 01 10 /* 主键 */ 7F FF FF FF / * -1 */ 80 00 00 01 / * 1 */ 80 00 00 00 00 00 00 01 /* bigint 1 */ 63 63 63 63 63 63 /* cccccc */
从上面可以看到1的表示和上面并不一样。通常符号标记位使用0表示正数,1表示负数,但是这里是正好相反的。并且注意到,-1的表示使用的是补码的方式。