基础
注意
客户端协议参考正在开发中。
大多数示例仅以 Go 语言提供。
本文档描述了 ClickHouse TCP 客户端的二进制协议。
可变长度整数
对于长度、数据包代码和其他情况,使用无符号可变长度整数编码。使用 binary.PutUvarint 和 binary.ReadUvarint。
注意
不使用有符号可变长度整数。
字符串
可变长度字符串编码为(长度,值),其中长度为 可变长度整数,值为 utf8 字符串。
信息
验证长度以防止 OOM
0 ≤ len < MAX
- 编码
- 解码
s := "Hello, world!"
// Writing string length as uvarint.
buf := make([]byte, binary.MaxVarintLen64)
n := binary.PutUvarint(buf, uint64(len(s)))
buf = buf[:n]
// Writing string value.
buf = append(buf, s...)
r := bytes.NewReader([]byte{
0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c,
0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21,
})
// Read length.
n, err := binary.ReadUvarint(r)
if err != nil {
panic(err)
}
// Check n to prevent OOM or runtime exception in 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!|
DUhlbGxvLCB3b3JsZCE
data := []byte{
0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c,
0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21,
}
整数
提示
ClickHouse 使用小端序表示固定大小的整数。
Int32
v := int32(1000)
// Encode.
buf := make([]byte, 8)
binary.LittleEndian.PutUint32(buf, uint32(v))
// Decode.
d := int32(binary.LittleEndian.Uint32(buf))
fmt.Println(d) // 1000
- 十六进制转储
- Base64
00000000 e8 03 00 00 00 00 00 00 |........|
6AMAAAAAAAA
布尔值
布尔值由单个字节表示,1
表示true
,0
表示false
。