توضح هذه المواصفة الصيغة الثنائية التي يمكن استخدامها للترميز الثنائي لأنواع بيانات ClickHouse وفك ترميزها. تُستخدم هذه الصيغة في التسلسل الثنائي لعمود Dynamic، كما يمكن استخدامها في تنسيقات الإدخال/الإخراج RowBinaryWithNamesAndTypes وNative ضمن الإعدادات المقابلة.
يوضح الجدول أدناه كيفية تمثيل كل نوع بيانات بالصيغة الثنائية. يتكون ترميز كل نوع بيانات من 1 بايت يشير إلى النوع، مع بعض المعلومات الإضافية الاختيارية.
يعني var_uint في الترميز الثنائي أن الحجم مُرمَّز باستخدام ضغط Variable-Length Quantity.
| نوع بيانات ClickHouse | الترميز الثنائي |
|---|---|
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> (راجِع الترميز الثنائي لـ Interval kind) |
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> (راجِع الترميز الثنائي لمعلمات الدالة التجميعية) |
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> |
Custom type (Ring, Polygon, إلخ) |
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> (راجِع الترميز الثنائي لمعلمات الدالة التجميعية) |
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> |
بالنسبة إلى النوع JSON، يشير البايت uint8_serialization_version إلى إصدار التسلسل. حاليًا يكون هذا الإصدار دائمًا 0، لكنه قد يتغير مستقبلًا إذا أُضيفت معاملات جديدة للنوع JSON.
بالنسبة إلى النوع QBit، لا يُستخدم الترميز 0x37 إلا عندما تختلف قيمة stride عن البعد N. وعندما يكون stride == N (بما في ذلك عندما تُكتب المعاملة الثالثة صراحةً، كما في QBit(Float32, 4, 4)) يُحوَّل النوع إلى الصيغة القياسية ذات المعاملين QBit(T, N) ويُرمَّز له بالقيمة 0x36 المذكورة أعلاه، بحيث يظل ترميزه الثنائي مطابقًا تمامًا على مستوى البايت لنوع QBit غير المستخدِم لـ stride.
الترميز الثنائي لفئات Interval
يوضح الجدول أدناه كيفية ترميز الفئات المختلفة لنوع البيانات Interval.
| فئة Interval | الترميز الثنائي |
|---|---|
Nanosecond |
0x00 |
Microsecond |
0x01 |
Millisecond |
0x02 |
Second |
0x03 |
Minute |
0x04 |
Hour |
0x05 |
Day |
0x06 |
Week |
0x07 |
Month |
0x08 |
Quarter |
0x09 |
Year |
0x1A |
الترميز الثنائي لمعاملات الدالة التجميعية
يوضح الجدول أدناه كيفية ترميز معاملات AggregateFunction وSimpleAggregateFunction.
ويتألف ترميز المعامل من بايت واحد يحدد نوع المعامل، ثم القيمة نفسها.
| نوع المعامل | الترميز الثنائي |
|---|---|
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> |
| اللانهاية السالبة | 0xFE |
| اللانهاية الموجبة | 0xFF |