Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

RowBinaryWithNamesAndTypesAndDefaults

Entrée Sortie Alias
✔ ✗

Description

Semblable au format RowBinaryWithNamesAndTypes, mais avec un octet supplémentaire avant chaque cellule indiquant si la valeur DEFAULT de la colonne doit être utilisée — exactement comme dans le format RowBinaryWithDefaults. Cette combinaison prend en charge les INSERT avec évolution du schéma : l'émetteur peut omettre des colonnes de l'en-tête (elles reçoivent alors la valeur DEFAULT de la colonne cible) et, pour chaque colonne qu'il envoie, il peut marquer certaines cellules comme « utiliser la valeur DEFAULT de la colonne » sans confondre cela avec NULL.

Ce format est pris en charge uniquement en entrée.

Format de transmission

L’en-tête est identique à RowBinaryWithNamesAndTypes :

  1. Un VarUInt indiquant le nombre de colonnes N.
  2. N String précédées de leur longueur, contenant les noms de colonnes.
  3. N types de colonnes — soit des noms textuels, soit un encodage binaire compact, selon les paramètres output_format_binary_encode_types_in_binary_format / input_format_binary_decode_types_in_binary_format.

Après l’en-tête, chaque ligne se compose de N cellules. Pour chaque cellule :

  • Un unique octet marqueur UInt8.
    • 0x01 — utilise l’expression DEFAULT de la colonne cible. Aucun octet de valeur ne suit.
    • 0x00 — une valeur suit, sérialisée avec le sérialiseur RowBinary du type de colonne. Pour Nullable(T), les octets de valeur commencent par l’octet NULL de Nullable (0 pour non-NULL, 1 pour NULL), puis par la valeur interne si elle n’est pas NULL.

Valeurs par défaut vs NULL

Le marqueur de valeur par cellule et l’octet NULL intégré à Nullable sont indépendants. Une colonne Nullable(UInt32) DEFAULT 42 peut être envoyée de trois façons différentes pour chaque ligne :

Octets Signification
01 Utiliser DEFAULT 42.
00 01 Chemin de valeur, puis NULL via le type Nullable.
00 00 … Chemin de valeur, puis une valeur interne non nulle.

Évolution du schéma

Cas Comportement
Colonne entièrement absente de l’en-tête du fichier Remplie dans la cible via insertDefaultsForNotSeenColumns ; contrôlée par defaults_for_omitted_fields.
Colonne présente dans l’en-tête, marqueur de cellule 0x01 insertDefault pour chaque ligne.
Colonne présente dans l’en-tête, marqueur de cellule 0x00 La valeur est parsée normalement.
Colonne supplémentaire dans l’en-tête, absente de la table cible Ignorée silencieusement lorsque input_format_skip_unknown_fields = 1 (le marqueur est d’abord consommé ; si 0x01, rien d’autre ; si 0x00, la valeur typée est parsée puis ignorée).

Exemple d’utilisation

Querysql
SELECT * FROM format(
    'RowBinaryWithNamesAndTypesAndDefaults',
    'x Nullable(UInt32) DEFAULT 42',
    unhex('01' || '0178' || '10' || hex('Nullable(UInt32)') || '01')
);
Responseresponse
┌──x─┐
│ 42 │
└────┘
  • L’en-tête comprend une colonne nommée x de type Nullable(UInt32).
  • L’unique cellule utilise le marqueur 0x01, ce qui signifie "utiliser DEFAULT 42".

Paramètres de format

Les paramètres suivants sont communs à tous les formats de type RowBinary.

Paramètre Description Par défaut
format_binary_max_string_size Taille maximale autorisée pour String dans le format RowBinary. 1GiB
output_format_binary_encode_types_in_binary_format Permet d'écrire les types dans l'en-tête à l'aide d'un encodage binaire au lieu de chaînes contenant les noms de type dans le format de sortie RowBinaryWithNamesAndTypes. false
input_format_binary_decode_types_in_binary_format Permet de lire les types dans l'en-tête à l'aide d'un encodage binaire au lieu de chaînes contenant les noms de type dans le format d'entrée RowBinaryWithNamesAndTypes. false
output_format_binary_write_json_as_string Permet d'écrire les valeurs du type de données JSON comme des valeurs JSON de type String dans le format de sortie RowBinary. false
input_format_binary_read_json_as_string Permet de lire les valeurs du type de données JSON comme des valeurs JSON de type String dans le format d'entrée RowBinary. false
Navigation