MySQL:24 一行数据中的多个NULL字段值在磁盘上怎么存储

1. 一行数据里的NULL值不能直接存储

在磁盘上存储的一行数据里有另一块特殊的数据区域,就是NULL值列表。

这个所谓的NULL值列表,顾名思义,说的就是一行数据里可能有的字段值是NULL,比如有一个name字段,它是允许为NULL的,那么实际上在存储的时候,如果你没给它赋值,它这个字段的值就是NULL。

由于它是个NULL,说明什么值都没有。实际上在磁盘上存储数据的时候,一行数据里的NULL值是肯定不会直接按照字符串的方式存放在磁盘上浪费空间的。

2. NULL值是以二进制bit位来存储的

一个表中的所有NULL值,不通过字符串在磁盘上存储,而是通过二进制的bit位来存储,一行数据里假设有多个字段的值都是NULL,那么这多个字段的NULL,就会以bit的形式存储在NULL值列表中。

假设当前有个表,有5个字段:name address gender job school ,其中的gender是CHAR(1),其他的是VARCHAR(10~50不等)的字段类型,而除了第一个字段声明了NOT NULL的,其他4个字段都可能是NULL。

如果该表有一行数据存储到磁盘的话,举例来说它的格式是: “jack NULL m NULL  xx_school”,它的字段里有两个字段都是NULL。

3.结合案例来思考一行数据的磁盘存储格式

前面说过,一行数据在磁盘上的存储格式应该是下面这样的:

变长字段长度列表 NULL值列表  头信息 column1=value1 column2=value2  ...  columnN=valueN

如果该表有一行数据存储到磁盘的话,举例来说它的格式是: “jack NULL m NULL  xx_school”,它的字段里有两个字段都是NULL。

只有name和school两个变长字段是有值的,把他们的长度按照逆序放在变长字段长度列表中就可以了,如下所示:

0x09 0x04 NULL值列表 头信息 column1=value1 column2=value2 ... columnN=valueN

接着来看NULL值列表,这个NULL值列表是这样存放的,所有允许值为NULL的字段。只要是允许你为NULL的字段,在这里每个字段都有一个二进制bit位的值,如果bit值是1说明是NULL,如果bit值是0说明不是NULL。

以上面的例子,也就是一行数据的值是 “jack NULL m NULL xx_school”  来说,他这里有四个变长字段,其中2个字段是null,2个字段不是null,所以4个bit位应该是: 1010。

由于实际放在NULL值列表的时候,是按逆序放的,所以在NULL值列表里,放的是: 0101,整体这一行数据看着是下面这样的:

0x09 0x04 0101 头信息 column1=value1 column2=value2 ... columnN=valueN

另外由于它实际NULL值列表存放的时候,不会仅仅是4个bit位,一般起码是8个bit位的倍数,如果不足8个bit位就高位补0,所以实际存放看起来是如下的:

0x09 0x04 00000101 头信息 column1=value1 column2=value2 ... columnN=valueN

4.磁盘上的一行数据是如何读取出来的?

在上面的原理分析中,一行数据的磁盘数据存储格式如下:

0x09 0x04 00000101 头信息 column1=value1 column2=value2 ... columnN=valueN

那么如果想要将他从磁盘上读取出来。

首先要把变长字段长度列表和NULL值列表读取出来,通过综合分析一下,就知道有几个变长字段,哪几个变长字段是NULL,因为NULL值列表里谁不是NULL都一清二楚。

如果是变长字段的值,就按照他的值长度来读取,如果是NULL,就知道它是个NULL,没有值存储,如果是定长字段,就按照定长长度来读取,这样就可以完美的把一行数据的值都读取出来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值