MySQL通讯协议-数据类型

@心欲无痕  July 24, 2019

之所以写这一一系列的博客介绍MySQL的协议,是因为目前接触了这块,打算记录下来,以备不时之需

MySQL协议的数据类型

其实在MySQL的协议里面你会到处看到一些数据类型的时候看到一些如下所示的代名词:int<1>int<3>等等,那么这些是什么含义勒?其实在MySQL协议里面只有两种类型:一种是int<x> 或者是 string<x>,所以准确理解这些有帮助,但是切记千万不能按照普通情况下把这里的 int 当做 C语言的 int类型,否则你永远都会有理解偏差,应该把这里的 int 理解为 C 语言中的 char 类型,最为贴切,因为在 MySQL 表示的是一个字节的宽度,而非 C语言中 int 所占用的 2 个字节或者 4 个字节的宽度

如下是 MySQL官网的文档,我截取出来让大伙瞧瞧:

int<1>

int<2>

int<3>

int<4>

int<6>

int<8>

Example
A int<3> with the value 1 is stored as:

01 00 00

其实到这里我们就应该知道了 MySQL的字节流顺序,MySQL使用的是普通的情况下的 小端字节流 顺序,什么是小端字节流,其实就是我们理解的内存中的 大小端模式

大小端模式

  • 什么是大小端?
    如果给你一个字符串:0xAEF94D5A,那么小端模式是按照如下形式部署字节信息的:
内存位置内存值
0x48AE
0x50F9
0x584D
0x605A

也就是说先开始的字符串是一个字节流中的最后,以此类推。大端模式则相反,因此我们在 `MySQL里面会看到信息如下:

01 00 00

其实其表示的就是 0x000001 也就是 整数 1 的含义。

字符串类型

MySQL 协议里面的字符串类型有如下几种:

string<fix> string<NUL> string<var> string<lenenc> string<EOF>

其含义分别如下

  • string<fix>
    这种类型表示字符串的长度是固定的,属于硬编码的长度,例如:在一个 MySQL 应答报文中,如果是 错误报文,那么其 sql-state 字段长度固定 5 字节长度
  • string<NUL>
    这种类型字符串结尾有一个 \0 字符,或者 C 语言的其他表示 0 的字符
  • string<var>
    这种类型的字符串的长度,是通过其他的字段或者Bit位 来决定的,比如 SELECT 查询的返回值中的 VARCHAR 类型就是一个示例
  • string<lenenc>
    这种类型的字符串表示其字符串的长度有前面的 bit位的值决定的。
  • string<EOF>
    这种类型的字符串其长度是由其包的总长度进行其他字段的长度运算后得出的,所以一般这种类型的数据出现在一个包的结尾

目前正在搞一个 mbinlogmq的项目,将通过 MySQLbinlog 协议将数据实时同步到 RabbitMQ

点击进入 mbinlogmq
这篇文章就介绍到这里了,下一篇文章开始MySQL的协议了。


添加新评论