Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

RowBinaryWithNamesAndTypesAndDefaults

Вход Выход Псевдоним

Описание

Похож на формат RowBinaryWithNamesAndTypes, но перед каждой ячейкой добавляется дополнительный байт, который указывает, нужно ли использовать значение DEFAULT для столбца, — точно так же, как в формате RowBinaryWithDefaults. Такая комбинация поддерживает INSERT при изменении схемы: отправитель может опускать столбцы в заголовке (тогда для них используется DEFAULT целевого столбца), а для любого передаваемого столбца может помечать отдельные ячейки как «использовать DEFAULT столбца», не смешивая это с NULL.

Этот формат предназначен только для ввода.

Формат передачи данных

Заголовок идентичен RowBinaryWithNamesAndTypes:

  1. VarUInt с числом столбцов N.
  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), затем идет внутреннее значение, если оно не равно NULL.

Значения по умолчанию и NULL

Маркер значения по умолчанию для каждой ячейки и встроенный null-байт в Nullable независимы друг от друга. Столбец Nullable(UInt32) DEFAULT 42 можно передавать тремя разными способами для каждой строки:

Байты Значение
01 Использовать DEFAULT 42.
00 01 Сначала путь значения, затем NULL через тип Nullable.
00 00 … Сначала путь значения, затем ненулевое внутреннее значение.

Изменение схемы

Случай Поведение
Столбец полностью отсутствует в заголовке файла Заполняется в целевой таблице с помощью insertDefaultsForNotSeenColumns; управляется параметром defaults_for_omitted_fields.
Столбец присутствует в заголовке, маркер ячейки 0x01 Для каждой строки вызывается insertDefault.
Столбец присутствует в заголовке, маркер ячейки 0x00 Значение разбирается как обычно.
Лишний столбец в заголовке, отсутствующий в целевой таблице Игнорируется, если input_format_skip_unknown_fields = 1 (сначала считывается маркер; если 0x01, больше ничего не происходит; если 0x00, типизированное значение разбирается и отбрасывается).

Пример использования

Querysql
SELECT * FROM format(
    'RowBinaryWithNamesAndTypesAndDefaults',
    'x Nullable(UInt32) DEFAULT 42',
    unhex('01' || '0178' || '10' || hex('Nullable(UInt32)') || '01')
);
Responseresponse
┌──x─┐
│ 42 │
└────┘
  • В заголовке указан один столбец с именем x типа Nullable(UInt32).
  • Единственная ячейка использует маркер 0x01, что означает "использовать DEFAULT 42".

Настройки формата

Следующие настройки общие для всех форматов типа RowBinary.

Настройка Описание По умолчанию
format_binary_max_string_size Максимально допустимый размер значения String в формате RowBinary. 1GiB
output_format_binary_encode_types_in_binary_format Позволяет записывать типы в заголовке с использованием двоичного кодирования вместо строк с именами типов в выходном формате RowBinaryWithNamesAndTypes. false
input_format_binary_decode_types_in_binary_format Позволяет читать типы в заголовке с использованием двоичного кодирования вместо строк с именами типов во входном формате RowBinaryWithNamesAndTypes. false
output_format_binary_write_json_as_string Позволяет записывать значения типа данных JSON как значения JSON типа String в выходном формате RowBinary. false
input_format_binary_read_json_as_string Позволяет читать значения типа данных JSON как значения JSON типа String во входном формате RowBinary. false
Navigation