Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Especificación de codificación binaria de los tipos de datos

Esta especificación describe el formato binario que puede usarse para la codificación y decodificación binaria de los tipos de datos de ClickHouse. Este formato se usa en la serialización binaria de la columna Dynamic y puede usarse en los formatos de entrada/salida RowBinaryWithNamesAndTypes y Native con la configuración correspondiente.

La tabla siguiente describe cómo se representa cada tipo de dato en formato binario. La codificación de cada tipo de dato consta de 1 byte que indica el tipo y de información adicional opcional. var_uint en la codificación binaria significa que el tamaño se codifica mediante compresión Variable-Length Quantity.

Tipo de dato de ClickHouse Codificación binaria
Nothing 0x00
UInt8 0x01
UInt16 0x02
UInt32 0x03
UInt64 0x04
UInt128 0x05
UInt256 0x06
Int8 0x07
Int16 0x08
Int32 0x09
Int64 0x0A
Int128 0x0B
Int256 0x0C
Float32 0x0D
Float64 0x0E
Date 0x0F
Date32 0x10
DateTime 0x11
DateTime(time_zone) 0x12<var_uint_time_zone_name_size><time_zone_name_data>
DateTime64(P) 0x13<uint8_precision>
DateTime64(P, time_zone) 0x14<uint8_precision><var_uint_time_zone_name_size><time_zone_name_data>
String 0x15
FixedString(N) 0x16<var_uint_size>
Enum8 0x17<var_uint_number_of_elements><var_uint_name_size_1><name_data_1><int8_value_1>...<var_uint_name_size_N><name_data_N><int8_value_N>
Enum16 0x18<var_uint_number_of_elements><var_uint_name_size_1><name_data_1><int16_little_endian_value_1>...><var_uint_name_size_N><name_data_N><int16_little_endian_value_N>
Decimal32(P, S) 0x19<uint8_precision><uint8_scale>
Decimal64(P, S) 0x1A<uint8_precision><uint8_scale>
Decimal128(P, S) 0x1B<uint8_precision><uint8_scale>
Decimal256(P, S) 0x1C<uint8_precision><uint8_scale>
UUID 0x1D
Array(T) 0x1E<nested_type_encoding>
Tuple(T1, ..., TN) 0x1F<var_uint_number_of_elements><nested_type_encoding_1>...<nested_type_encoding_N>
Tuple(name1 T1, ..., nameN TN) 0x20<var_uint_number_of_elements><var_uint_name_size_1><name_data_1><nested_type_encoding_1>...<var_uint_name_size_N><name_data_N><nested_type_encoding_N>
Set 0x21
Interval 0x22<interval_kind> (consulte la codificación binaria del tipo de intervalo)
Nullable(T) 0x23<nested_type_encoding>
Function 0x24<var_uint_number_of_arguments><argument_type_encoding_1>...<argument_type_encoding_N><return_type_encoding>
AggregateFunction(function_name(param_1, ..., param_N), arg_T1, ..., arg_TN) 0x25<var_uint_version><var_uint_function_name_size><function_name_data><var_uint_number_of_parameters><param_1>...<param_N><var_uint_number_of_arguments><argument_type_encoding_1>...<argument_type_encoding_N> (consulte la codificación binaria de los parámetros de la función de agregado)
LowCardinality(T) 0x26<nested_type_encoding>
Map(K, V) 0x27<key_type_encoding><value_type_encoding>
IPv4 0x28
IPv6 0x29
Variant(T1, ..., TN) 0x2A<var_uint_number_of_variants><variant_type_encoding_1>...<variant_type_encoding_N>
Dynamic(max_types=N) 0x2B<uint8_max_types>
Tipo personalizado (Ring, Polygon, etc) 0x2C<var_uint_type_name_size><type_name_data>
Bool 0x2D
SimpleAggregateFunction(function_name(param_1, ..., param_N), arg_T1, ..., arg_TN) 0x2E<var_uint_function_name_size><function_name_data><var_uint_number_of_parameters><param_1>...<param_N><var_uint_number_of_arguments><argument_type_encoding_1>...<argument_type_encoding_N> (consulte la codificación binaria de los parámetros de la función de agregado)
Nested(name1 T1, ..., nameN TN) 0x2F<var_uint_number_of_elements><var_uint_name_size_1><name_data_1><nested_type_encoding_1>...<var_uint_name_size_N><name_data_N><nested_type_encoding_N>
JSON(max_dynamic_paths=N, max_dynamic_types=M, path Type, SKIP skip_path, SKIP REGEXP skip_path_regexp) 0x30<uint8_serialization_version><var_int_max_dynamic_paths><uint8_max_dynamic_types><var_uint_number_of_typed_paths><var_uint_path_name_size_1><path_name_data_1><encoded_type_1>...<var_uint_number_of_skip_paths><var_uint_skip_path_size_1><skip_path_data_1>...<var_uint_number_of_skip_path_regexps><var_uint_skip_path_regexp_size_1><skip_path_data_regexp_1>...
BFloat16 0x31
Time 0x32
Time64(P) 0x34<uint8_precision>
QBit(T, N) 0x36<element_type_encoding><var_uint_dimension>
QBit(T, N, stride) 0x37<element_type_encoding><var_uint_dimension><var_uint_stride>

Para el tipo JSON, el byte uint8_serialization_version indica la versión de la serialización. Por ahora, la versión siempre es 0, pero puede cambiar en el futuro si se introducen nuevos argumentos para el tipo JSON.

Para el tipo QBit, la codificación 0x37 se usa solo cuando stride difiere de la dimensión N. Cuando stride == N (incluido cuando el tercer argumento se escribe explícitamente, como en QBit(Float32, 4, 4)), el tipo se convierte a la forma canónica de dos argumentos QBit(T, N) y se codifica como 0x36, por lo que su codificación binaria sigue siendo idéntica byte a byte a la de un QBit sin stride.

Codificación binaria del tipo de intervalo

La siguiente tabla describe cómo se codifican los distintos tipos de intervalo del tipo de dato Interval.

Tipo de intervalo Codificación binaria
Nanosecond 0x00
Microsecond 0x01
Millisecond 0x02
Second 0x03
Minute 0x04
Hour 0x05
Day 0x06
Week 0x07
Month 0x08
Quarter 0x09
Year 0x1A

Codificación binaria de parámetros de funciones de agregado

La tabla siguiente describe cómo se codifican los parámetros de AggregateFunction y SimpleAggregateFunction. La codificación de un parámetro se compone de 1 byte que indica el tipo de parámetro y del valor en sí.

Tipo de parámetro Codificación binaria
Null 0x00
UInt64 0x01<var_uint_value>
Int64 0x02<var_int_value>
UInt128 0x03<uint128_little_endian_value>
Int128 0x04<int128_little_endian_value>
UInt256 0x05<uint256_little_endian_value>
Int256 0x06<int256_little_endian_value>
Float64 0x07<float64_little_endian_value>
Decimal32 0x08<var_uint_scale><int32_little_endian_value>
Decimal64 0x09<var_uint_scale><int64_little_endian_value>
Decimal128 0x0A<var_uint_scale><int128_little_endian_value>
Decimal256 0x0B<var_uint_scale><int256_little_endian_value>
String 0x0C<var_uint_size><data>
Array 0x0D<var_uint_size><value_encoding_1>...<value_encoding_N>
Tuple 0x0E<var_uint_size><value_encoding_1>...<value_encoding_N>
Map 0x0F<var_uint_size><key_encoding_1><value_encoding_1>...<key_encoding_N><value_encoding_N>
IPv4 0x10<uint32_little_endian_value>
IPv6 0x11<uint128_little_endian_value>
UUID 0x12<uuid_value>
Bool 0x13<bool_value>
Object 0x14<var_uint_size><var_uint_key_size_1><key_data_1><value_encoding_1>...<var_uint_key_size_N><key_data_N><value_encoding_N>
AggregateFunctionState 0x15<var_uint_name_size><name_data><var_uint_data_size><data>
Infinito negativo 0xFE
Infinito positivo 0xFF
Navigation