在向表里插入数据时,可以指定某一个字段的值为NULL。比如一张表t(i int, j int, k int),我们可以执行insert into t values(8,1,6),也可以执行insert into t values(3,NULL,7)插入一个带有NULL值的记录。这个博客将探讨在PG中存储NULL值的一些技术细节。
NULL值的存储问题
PG中一条tuple分为TupleHead部分和数据部分,上面提到了向表t插入数据的两个例子,这里使用一个图片抛出这个问题:在元组中如何表示这个NULL值?
如图中,在没有NULL值的情况下,一个int数据类型可以占满4个字节的空间。但是在有NULL值的情况下,数据库应该如何表示在3和7之间存在一个NULL呢?
PG中NULL值存储方式
我们使用pageinspact工具观察一下,NULL值的存储方式,如下测试:
postgres=# cre