Mysql Innodb中的int类型字段在文件中是怎么存储的?

今天记录一个比较有意思的东西,看一下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的表示使用的是补码的方式。

 

posted @ 2021-02-07 17:28  不吃陈皮  阅读(227)  评论(0编辑  收藏  举报