跳到主要内容
跳到主要内容

Nullable(T)

允许存储特殊标记 (NULL),表示与 T 允许的正常值并列的“缺失值”。例如,Nullable(Int8) 类型列可以存储 Int8 类型值,并且没有值的行将存储 NULL

T 不能是任何复合数据类型 ArrayMapTuple,但复合数据类型可以包含 Nullable 类型的值,例如 Array(Nullable(Int8))

Nullable 类型字段不能包含在表索引中。

NULL 是任何 Nullable 类型的默认值,除非在 ClickHouse 服务器配置中另有指定。

存储特性

为了在表列中存储 Nullable 类型的值,ClickHouse 除了包含值的普通文件外,还使用一个单独的文件来存储 NULL 掩码。掩码文件中的条目允许 ClickHouse 区分每行表的 NULL 和相应数据类型的默认值。由于使用了额外的文件,与类似的普通列相比,Nullable 列会消耗额外的存储空间。

注意

使用 Nullable 几乎总是会对性能产生负面影响,在设计数据库时请记住这一点。

查找 NULL

可以通过使用 null 子列来查找列中的 NULL 值,而无需读取整个列。如果对应的值是 NULL,则返回 1,否则返回 0

示例

查询

CREATE TABLE nullable (`n` Nullable(UInt32)) ENGINE = MergeTree ORDER BY tuple();

INSERT INTO nullable VALUES (1) (NULL) (2) (NULL);

SELECT n.null FROM nullable;

结果

┌─n.null─┐
│ 0 │
│ 1 │
│ 0 │
│ 1 │
└────────┘

使用示例

CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
INSERT INTO t_null VALUES (1, NULL), (2, 3)
SELECT x + y FROM t_null
┌─plus(x, y)─┐
│ ᴺᵁᴸᴸ │
│ 5 │
└────────────┘