La referencia del protocolo del cliente está en desarrollo.La mayoría de los ejemplos solo están en Go.
Este documento describe el protocolo binario para los clientes TCP de ClickHouse.
Para las longitudes, los códigos de paquete y otros casos, se utiliza la codificación unsigned varint.
Utilice binary.PutUvarint y binary.ReadUvarint.
No se utiliza signed varint.
Las cadenas de longitud variable se codifican como (longitud, valor), donde longitud es varint y valor es una cadena UTF-8.
Valide la longitud para evitar OOM:0 ≤ len < MAX
s := "Hello, world!"
// Escribir la longitud de la cadena como uvarint.
buf := make([]byte, binary.MaxVarintLen64)
n := binary.PutUvarint(buf, uint64(len(s)))
buf = buf[:n]
// Escribir el valor de la cadena.
buf = append(buf, s...)
r := bytes.NewReader([]byte{
0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c,
0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21,
})
// Leer la longitud.
n, err := binary.ReadUvarint(r)
if err != nil {
panic(err)
}
// Compruebe n para evitar OOM o una excepción de runtime en 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!
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 utiliza Little Endian para los enteros de tamaño fijo.
v := int32(1000)
// Codificar.
buf := make([]byte, 8)
binary.LittleEndian.PutUint32(buf, uint32(v))
// Decodificar.
d := int32(binary.LittleEndian.Uint32(buf))
fmt.Println(d) // 1000
Volcado hexadecimal
Base64
00000000 e8 03 00 00 00 00 00 00 |........|
Los valores booleanos se representan con un único byte: 1 es true y 0 es false.