数値型のエンコーディングは、AMD64 や ARM64 などのリトルエンディアン CPU のメモリレイアウトと一致しているため、非常に効率よくエンコードおよびデコードできます。
| 型 | エンコーディング |
|---|---|
| 整数 (Int/UInt) | リトルエンディアンの 8、16、32、64、128、または 256 ビット |
| 浮動小数点数 (Float32/Float64) | IEEE 754 のバイナリ表現 |
| String | 文字列の配列。各要素は (len, value) |
| FixedString(N) | N バイトのシーケンスの配列 |
| IPv4 | UInt32 の別名で、UInt32 として表現されます |
| IPv6 | FixedString(16) の別名で、バイナリとして表現されます |
| Tuple | 連続してエンコードされたカラムの配列。例: Tuple(String, UInt8) = 2 つの連続したカラム |
| Map | Map(K, V) = 3 つのカラム: Offsets ColUInt64, Keys K, Values V。Keys/Values の行数 = 最後の Offsets の値 |
| Array | Array(T) = 2 つのカラム: Offsets ColUInt64, Data T。Data の行数 = 最後の Offsets の値 |
| Nullable | Nullable(T) = 2 つのカラム: Nulls ColUInt8, Values T。行数は同じです。Nulls はマスクです: 1=null、0=value |
| UUID | FixedString(16) の別名で、バイナリとして表現されます |
| Enum | Int8 または Int16 の別名で、各整数は String 値に対応付けられます |
| LowCardinality | LowCardinality(T) = 2 つのカラム: Index T, Keys K。ここで K は UInt8/16/32/64 です。Index には一意な値が含まれ、Keys には Index 内の位置を示す値が含まれます |
| Bool | UInt8 の別名: 0=false、1=true |
[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)