跳转到主要内容
允许在 T 所允许的正常值之外,存储表示“缺失值”的特殊标记 (NULL) 。例如,Nullable(Int8) 类型的列可以存储 Int8 类型的值,而没有值的行则存储 NULL T 不能是以下任一复合数据类型:
  • Array — 不支持
  • Map — 不支持
  • Tuple — 提供 Experimental 支持*
不过,复合数据类型可以包含 Nullable 类型的值,例如 Array(Nullable(Int8))Tuple(Nullable(String), Nullable(Int64))
Experimental:Nullable Tuple
Nullable 类型的字段不能包含在表索引中。 除非在 ClickHouse 服务器配置中另有指定,否则 NULL 是所有 Nullable 类型的默认值。

存储特性

要在表的列中存储 Nullable 类型的值,ClickHouse 除了存放值的普通文件外,还会使用一个单独的文件来存储 NULL 掩码。掩码文件中的条目使 ClickHouse 能够区分每个表行中的 NULL 和相应数据类型的默认值。由于多了一个额外文件,Nullable 列相比类似的普通列会占用更多存储空间。
使用 Nullable 几乎总会对性能产生负面影响,设计数据库时请牢记这一点。

查找 NULL

可以通过 null 子列在无需读取整列的情况下查找列中的 NULL 值。若对应的值为 NULL,则返回 1;否则返回 0 示例
Query
CREATE TABLE nullable (`n` Nullable(UInt32)) ENGINE = MergeTree ORDER BY tuple();

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

SELECT n.null FROM nullable;
Response
┌─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 │
└────────────┘
最后修改于 2026年6月10日