A codificação dos tipos numéricos corresponde ao layout de memória de CPUs little endian, como AMD64 ou ARM64, o que permite codificação e decodificação muito eficientes.
| Tipo | Codificação |
|---|---|
| Inteiros (Int/UInt) | 8, 16, 32, 64, 128 ou 256 bits em little endian |
| Floats (Float32/Float64) | Representação binária IEEE 754 |
| String | Array de strings no formato (len, value) |
| FixedString(N) | Array de sequências de N bytes |
| IPv4 | Alias de UInt32, representado como UInt32 |
| IPv6 | Alias de FixedString(16), representado em binário |
| Tuple | Array de colunas codificadas de forma contínua. Exemplo: Tuple(String, UInt8) = duas colunas contínuas |
| Map | Map(K, V) = três colunas: Offsets ColUInt64, Keys K, Values V. A contagem de linhas em Keys/Values = último valor de Offsets |
| Array | Array(T) = duas colunas: Offsets ColUInt64, Data T. A contagem de linhas em Data = último valor de Offsets |
| Nullable | Nullable(T) = duas colunas: Nulls ColUInt8, Values T com a mesma contagem de linhas. Nulls é uma máscara: 1=null, 0=value |
| UUID | Alias de FixedString(16), representado em binário |
| Enum | Alias de Int8 ou Int16, com cada inteiro mapeado para um valor String |
| LowCardinality | LowCardinality(T) = duas colunas: Index T, Keys K, em que K é UInt8/16/32/64. Index contém valores únicos, e Keys contém índices em Index |
| Bool | Alias de UInt8: 0=false, 1=true |
To encode [null, "", "hello", null, "world"]:
Values: ["", "", "hello", "", "world"] (len: 5)
Nulls: [ 1, 0, 0, 1, 0] (len: 5)
To encode ["Eko", "Eko", "Amadela", "Amadela", "Amadela", "Amadela"]:
Index: ["Eko", "Amadela"] (String)
Keys: [0, 0, 1, 1, 1, 1] (UInt8)