一、基本数据类型

MySQL协议定义了2大类,7小类的数据类型,它们详细介绍如下:

1.1 数字类型

1.1.1 定长数字类型(FixLenInt)

MySQL报文中整型值分别有1、2、3、4、6、8字节长度。存储使用小端存储的方式,比如 2字节 02 00,表示数字 2 而不是 512。

1.1.2 变长数字类型(LenEncInt)

这一类型,字节长度可能为1、3、4、9四种情况。

数字范围 编码长度 编码格式
0-250 1字节 0 - FB(11111011)
251 - 2^16 3字节 FC(11111100) + 2个字节
2^16 - 2^24 4字节 FD(11111101) + 3个字节
2^24 - 2^64 9字节 FE(11111110) + 8个字节

1.2 字符类型

1.2.1 定长字符串类型(FixLenStr)

这一类主要是用于异常返回包(ERR_Packet),定长是5个字节

1.2.2 Null结尾字符串类型(NullTerStr)

这一类数据是以'\00’结尾的字符串类型。

1.2.3 变长字符串类型(VarEncStr)

字符串长度由其它字段决定或者运行时计算出来。

1.2.4 长度编码字符串类型(LenEncStr)

这一类字符串跟 2.1.2 类似,前缀是一个长度的编码,后续是真实字符串长度

1.2.5 包结束字符串类型(ResStr)

可以理解为就是填充字符,主要通过包长度减去数据长度剩余的部分。

二、协议结构

img

2.1 消息长度

按照当前协议,一个消息报文只能发送 2^24 - 1 长度的数据,即最大 16M-1,因此如果需要发送超过 16M 大的数据,需要将数据截断,多次发送,知道最后一个包小于 2^24 -1 为止,此时需要使用消息序号来进行数据排序组装。PS:对于 2^24 -1 临界长度的数据包,再发送所有数据之后,需要发一个长度为 0 的消息报文表示数据发送结束。

2.2 消息序号

  • 消息序号从客户端每一次发起命令开始,从0逐个报文递增,如果数据包过大,序号可能会循环使用(比如数据大小超过 2^8 * 2^24)。
  • 每次命令开始时序号会重置为0。

2.3 数据包

数据包字段,就是根据不同阶段返回使用第二节中介绍的编码方式编码的具体协议信息。

参考:

https://zhuanlan.zhihu.com/p/620225986

https://zhuanlan.zhihu.com/p/144657586

https://zhuanlan.zhihu.com/p/405304810

(完)