跳转到主要内容

说明

RowBinaryWithNamesAndTypes 格式类似,但在每个单元前会额外增加一个字节,用于指示是否应使用该列的 DEFAULT 值——这与 RowBinaryWithDefaults 格式中的行为完全一致。这种组合支持 schema 演进中的 INSERT:写入端可以在请求头中省略某些列 (这些列将使用目标列的 DEFAULT) ,并且对于它实际发送的任意列,还可以将单个单元标记为“使用该列的 DEFAULT”,而不会与 NULL 混淆。 此格式仅用于输入。

传输格式

请求头与 RowBinaryWithNamesAndTypes 完全相同:
  1. 一个表示列数 NVarUInt
  2. N 个带长度前缀的列名 String
  3. N 个列类型——可以是文本名称,也可以是紧凑的二进制编码,具体由 output_format_binary_encode_types_in_binary_format / input_format_binary_decode_types_in_binary_format 设置控制。
在请求头之后,每一行由 N 个单元组成。对于每个单元:
  • 一个 UInt8 标记字节。
    • 0x01 — 使用目标列的 DEFAULT 表达式,后面不跟任何值字节。
    • 0x00 — 后面跟一个值,并通过该列类型的 RowBinary 序列化器进行序列化。对于 Nullable(T),值字节以 Nullable 的 NULL 字节开头 (非空时为 0,NULL 时为 1) ;如果非空,后面再跟内部值。

默认值与 NULL

每个单元的默认值标记与 Nullable 内置的 null byte 是彼此独立的。Nullable(UInt32) DEFAULT 42 列在每一行中可以通过三种不同的方式发送:

schema 演进

使用示例

Query
Response
  • 请求头包含一列,名为 x,类型为 Nullable(UInt32)
  • 该单元使用标记 0x01,表示“使用 DEFAULT 42”。

格式设置

以下设置适用于所有 RowBinary 类型的格式。
最后修改于 2026年6月10日