跳转到主要内容
客户端协议参考文档仍在编写中。大多数示例仅有 Go 版本。
本文档介绍 ClickHouse TCP 客户端使用的二进制协议。

Varint

对于长度、数据包代码及其他情况,使用的是无符号 varint编码。 请使用 binary.PutUvarintbinary.ReadUvarint
不使用有符号 varint 编码。

String

可变长度字符串编码为 (length, value),其中 lengthvarintvalue 是 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...)
00000000  0d 48 65 6c 6c 6f 2c 20  77 6f 72 6c 64 21        |.Hello, world!|

整数

ClickHouse 对定长整数采用 小端序 (Little Endian)

Int32

v := int32(1000)

// 编码。
buf := make([]byte, 8)
binary.LittleEndian.PutUint32(buf, uint32(v))

// 解码。
d := int32(binary.LittleEndian.Uint32(buf))
fmt.Println(d) // 1000
00000000  e8 03 00 00 00 00 00 00                           |........|

布尔值

布尔值用单个字节表示,1 表示 true0 表示 false
最后修改于 2026年6月10日