RowBinaryWithNamesAndTypesAndDefaults
| Ввод | Вывод | Псевдоним |
|---|---|---|
| ✔ | ✗ |
Описание
Аналогично формату RowBinaryWithNamesAndTypes, но с дополнительным байтом перед каждой ячейкой, который указывает, нужно ли использовать значение DEFAULT для столбца, — точно так же, как в формате RowBinaryWithDefaults. Эта комбинация поддерживает INSERT с изменением схемы: отправляющая сторона может опускать столбцы в заголовке (в этом случае для них будет использоваться DEFAULT целевого столбца), а для любого столбца, который она всё же передаёт, может пометить отдельные ячейки как «использовать DEFAULT столбца», не смешивая это с NULL.
Этот формат предназначен только для ввода.
Формат передачи данных
Заголовок совпадает с RowBinaryWithNamesAndTypes:
VarUIntс количеством столбцовN.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)байты значения начинаются с null-байтаNullable(0для не-NULL,1для NULL), затем, если значение не NULL, идет внутреннее значение.
Значения по умолчанию и NULL
Маркер значения по умолчанию на уровне ячейки и встроенный в Nullable null-байт не зависят друг от друга. Столбец Nullable(UInt32) DEFAULT 42 можно передавать для каждой строки тремя разными способами:
| Байты | Значение |
|---|---|
01 | Использовать DEFAULT 42. |
00 01 | Вариант со значением, затем NULL через тип Nullable. |
00 00 … | Вариант со значением, затем внутреннее значение, отличное от NULL. |
Эволюция схемы
| Случай | Поведение |
|---|---|
| Столбец полностью отсутствует в заголовке файла | Заполняется в целевой таблице через insertDefaultsForNotSeenColumns; управляется параметром defaults_for_omitted_fields. |
Столбец присутствует в заголовке, маркер ячейки 0x01 | insertDefault для каждой строки. |
Столбец присутствует в заголовке, маркер ячейки 0x00 | Значение разбирается как обычно. |
| Лишний столбец в заголовке, отсутствующий в целевой таблице | Незаметно отбрасывается, если input_format_skip_unknown_fields = 1 (сначала обрабатывается маркер; если 0x01, больше ничего не происходит; если 0x00, типизированное значение разбирается и отбрасывается). |
Пример использования
- Заголовок содержит один столбец с именем
xи типомNullable(UInt32). - Единственная ячейка использует маркер
0x01, то есть "использоватьDEFAULT 42".
Настройки формата
Следующие настройки общие для всех форматов типа RowBinary.
| Setting | Description | Default |
|---|---|---|
format_binary_max_string_size | Максимально допустимый размер значения типа String в формате RowBinary. | 1GiB |
output_format_binary_encode_types_in_binary_format | Позволяет записывать типы в заголовке с использованием binary encoding вместо строк с именами типов в формате вывода RowBinaryWithNamesAndTypes. | false |
input_format_binary_decode_types_in_binary_format | Позволяет читать типы в заголовке с использованием binary encoding вместо строк с именами типов в формате ввода 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 |