说明
RowBinaryWithNamesAndTypes 格式类似,但在每个单元前会额外增加一个字节,用于指示是否应使用该列的 DEFAULT 值——这与 RowBinaryWithDefaults 格式中的行为完全一致。这种组合支持 schema 演进中的 INSERT:写入端可以在请求头中省略某些列 (这些列将使用目标列的 DEFAULT) ,并且对于它实际发送的任意列,还可以将单个单元标记为“使用该列的 DEFAULT”,而不会与 NULL 混淆。
此格式仅用于输入。
传输格式
RowBinaryWithNamesAndTypes 完全相同:
- 一个表示列数
N的VarUInt。 N个带长度前缀的列名String。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 类型的格式。