Кодирование числовых типов соответствует их представлению в памяти на процессорах с порядком байтов little-endian, таких как AMD64 и ARM64, что делает кодирование и декодирование очень эффективными.
| Type | Encoding |
|---|---|
| Целые числа (Int/UInt) | 8, 16, 32, 64, 128 или 256 бит в формате little-endian |
| Числа с плавающей точкой (Float32/Float64) | Двоичное представление IEEE 754 |
| String | Массив строк в виде (len, value) |
| FixedString(N) | Массив N-байтовых последовательностей |
| IPv4 | Псевдоним для UInt32, представляется как UInt32 |
| IPv6 | Псевдоним для FixedString(16), представляется в двоичном виде |
| Tuple | Массив столбцов, закодированных подряд. Пример: Tuple(String, UInt8) = два столбца подряд |
| Map | Map(K, V) = три столбца: Offsets ColUInt64, Keys K, Values V. Число строк в Keys/Values = последнее значение Offsets |
| Array | Array(T) = два столбца: Offsets ColUInt64, Data T. Число строк в Data = последнее значение Offsets |
| Nullable | Nullable(T) = два столбца: Nulls ColUInt8, Values T с одинаковым числом строк. Nulls — это маска: 1=null, 0=value |
| UUID | Псевдоним для FixedString(16), представляется в двоичном виде |
| Enum | Псевдоним для Int8 или Int16, где каждому целому числу сопоставлено значение String |
| LowCardinality | LowCardinality(T) = два столбца: Index T, Keys K, где K — UInt8/16/32/64. Index содержит уникальные значения, Keys содержит индексы в Index |
| Bool | Псевдоним для 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)