跳到主要内容
跳到主要内容

基础知识

注意

客户端协议参考文档正在编写中。

目前大部分示例仅提供 Go 语言版本。

本文档描述了 ClickHouse TCP 客户端使用的二进制协议。

Varint

对于长度、数据包代码以及其他场景,采用 无符号 varint 编码。 请使用 binary.PutUvarintbinary.ReadUvarint

注意

有符号 varint 不会被使用。

字符串

可变长度字符串编码为 (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                           |........|

布尔值

布尔值使用单个字节表示,1true0false