Справочник по клиентскому протоколу пока в разработке.Большинство примеров доступны только на Go.
В этом документе описан бинарный протокол TCP-клиентов ClickHouse.
Для длин, кодов пакетов и в других случаях используется кодирование unsigned varint.
Используйте binary.PutUvarint и binary.ReadUvarint.
Signed varint не используется.
Строки переменной длины кодируются как (length, value), где length — varint, а value — строка UTF-8.
Проверяйте длину, чтобы избежать OOM:0 ≤ len < MAX
Кодирование
Декодирование
s := "Hello, world!"
// Запись длины строки как uvarint.
buf := make([]byte, binary.MaxVarintLen64)
n := binary.PutUvarint(buf, uint64(len(s)))
buf = buf[:n]
// Запись значения строки.
buf = append(buf, s...)
r := bytes.NewReader([]byte{
0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c,
0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21,
})
// Чтение длины.
n, err := binary.ReadUvarint(r)
if err != nil {
panic(err)
}
// Проверка n, чтобы избежать OOM или ошибки времени выполнения в make().
const maxSize = 1024 * 1024 * 10 // 10 MB
if n > maxSize || n < 0 {
panic("invalid n")
}
buf := make([]byte, n)
if _, err := io.ReadFull(r, buf); err != nil {
panic(err)
}
fmt.Println(string(buf))
// Hello, world!
Шестнадцатеричный дамп
Base64
Go
00000000 0d 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 |.Hello, world!|
data := []byte{
0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c,
0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21,
}
ClickHouse использует Little Endian для целых чисел с фиксированным размером.
v := int32(1000)
// Кодирование.
buf := make([]byte, 8)
binary.LittleEndian.PutUint32(buf, uint32(v))
// Декодирование.
d := int32(binary.LittleEndian.Uint32(buf))
fmt.Println(d) // 1000
Шестнадцатеричный дамп
Base64
00000000 e8 03 00 00 00 00 00 00 |........|
Логические значения представлены одним байтом: 1 означает true, а 0 — false.Последнее изменение 10 июня 2026 г.