> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация для формата RowBinaryWithNamesAndTypesAndDefaults

# RowBinaryWithNamesAndTypesAndDefaults

| Вход | Выход | Псевдоним |
| ---- | ----- | --------- |
| ✔    | ✗     |           |

<div id="description">
  ## Описание
</div>

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

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

<div id="wire-format">
  ## Формат передачи данных
</div>

Заголовок идентичен [`RowBinaryWithNamesAndTypes`](/ru/reference/formats/RowBinary/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.

<div id="defaults-vs-null">
  ## Значения по умолчанию и NULL
</div>

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

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

<div id="schema-evolution">
  ## Изменение схемы
</div>

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

<div id="example-usage">
  ## Пример использования
</div>

```sql title="Query" theme={null}
SELECT * FROM format(
    'RowBinaryWithNamesAndTypesAndDefaults',
    'x Nullable(UInt32) DEFAULT 42',
    unhex('01' || '0178' || '10' || hex('Nullable(UInt32)') || '01')
);
```

```response title="Response" theme={null}
┌──x─┐
│ 42 │
└────┘
```

* В заголовке указан один столбец с именем `x` типа `Nullable(UInt32)`.
* Единственная ячейка использует маркер `0x01`, что означает "использовать `DEFAULT 42`".

<div id="format-settings">
  ## Настройки формата
</div>

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

| Настройка                                                                                                                                | Описание                                                                                                                                                                                                                                                                          | По умолчанию |
| ---------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
| [`format_binary_max_string_size`](/ru/reference/settings/formats#format_binary_max_string_size)                                          | Максимально допустимый размер значения String в формате RowBinary.                                                                                                                                                                                                                | `1GiB`       |
| [`output_format_binary_encode_types_in_binary_format`](/ru/reference/settings/formats#input_format_binary_decode_types_in_binary_format) | Позволяет записывать типы в заголовке с использованием [`двоичного кодирования`](/ru/reference/data-types/data-types-binary-encoding) вместо строк с именами типов в выходном формате [`RowBinaryWithNamesAndTypes`](/ru/reference/formats/RowBinary/RowBinaryWithNamesAndTypes). | `false`      |
| [`input_format_binary_decode_types_in_binary_format`](/ru/reference/settings/formats#input_format_binary_decode_types_in_binary_format)  | Позволяет читать типы в заголовке с использованием [`двоичного кодирования`](/ru/reference/data-types/data-types-binary-encoding) вместо строк с именами типов во входном формате [`RowBinaryWithNamesAndTypes`](/ru/reference/formats/RowBinary/RowBinaryWithNamesAndTypes).     | `false`      |
| [`output_format_binary_write_json_as_string`](/ru/reference/settings/formats#output_format_binary_write_json_as_string)                  | Позволяет записывать значения типа данных [`JSON`](/ru/reference/data-types/newjson) как значения `JSON` типа [String](/ru/reference/data-types/string) в выходном формате [`RowBinary`](/ru/reference/formats/RowBinary/RowBinary).                                              | `false`      |
| [`input_format_binary_read_json_as_string`](/ru/reference/settings/formats#input_format_binary_read_json_as_string)                      | Позволяет читать значения типа данных [`JSON`](/ru/reference/data-types/newjson) как значения `JSON` типа [String](/ru/reference/data-types/string) во входном формате [`RowBinary`](/ru/reference/formats/RowBinary/RowBinary).                                                  | `false`      |
