mysql交互协议是开发mysql周边组件常用的协议,如JDBC,libmysql等等。

在此我们要认识到mysql交互协议其实是半双工的交互协议,至于为什么,这里就先挖个小坑,以后再填。

在探讨mysql交互协议的格式之前,我们要理清一个小问题,就是mysql交互协议会用到的基本数据类型。

1.整数类型

这里的整数类型可以用来表示mysql数据类型中的整数类型、日期时间类型、DOUBLE、FLOAT类型、比特类型以及枚举类型等等。

所有的mysql整数类型都是小端的,这是网络数据的惯例。即对于16进制数0x12345678,在存储时会变成0x78563412

那么这里的整数数据类型有:int<len>(其中len = 1,2,3,4,6,8)以及可变的整数类型int<lenenc>

(1)int<len>是固定长度为len字节的整数数据,如int<3>表示数字3的话,会以小端 0x030000表示。

(2)int<lenenc>是可变长度类型的整数,这种字符的长度可以是1, 3, 4, 9。

  我们设要表示的数值是n

1)当 n < 251时,int<lenenc>会以int<1>表示。

  2)当251 <= n < 2^16时,int<lenenc>会以0xfc + int<2>表示。

  3)当2^16 <= n < 2^24时,int<lenenc>会以0xfd + int<3>表示。

  4)当2^24 <= n < 2^64时,int<lenenc>会以0xfe + int<8>表示。

  这就表示如果我们遇到int<lenenc>类型,我们需要先读取第一个数值type来判断

  1)当type < 0xfb时,就认为读取的数是type。

  2)当type == 0xfc时,就读取后面的int<2>,int<2>才是真实的数值。

  3)当type == 0xfd时,就读取后面的int<3>,int<3>才是真实的数值。

  4)当type == 0xfe时,就读取后面的int<8>,int<8>才是真实的数值。

 那么当type为0xff和0xfb是什么?这边挖坑在此以后再填。

可以剧透下的是:

0xff在mysql交互协议中一般代表某一个动作错误,

如发送一个插入命令失败后会有这种回复出现。

而0xfb代表NULL,就是mysql插入值往往会是空值,指的就是NULL

2.字符串类型

这里的字符串类型可以用来表示mysql的高精度小数类型、字符串类型、大比特类型以及大整数类型等等。

这里的字符串类型主要是

(1)string<len>就是长度为len的字符串。

(2)string<NUL> 就是string+'0x00',这里的'0x00'是作为结尾符的。

(3)string<lenenc>就是int<lenenc> +string,int<lenenc> 代表字符串的长度。

(4)string<EOF>就是在一个mysql交互包结尾处出现的字符串。换言之,这个字符串是一个mysql交互包的最后一个字符串。

(5)string<fix>和string<var>几乎用不到。

3.mysql包基本格式

mysql包长度 int<3> mysql包序号 int<1> mysql包内容 string<len>

mysql包长度就是mysql包内容的长度,不把包头即包长度和包序号计入mysql包长度中,一般是int<3>,如果超过长度2^24-1,mysql会进行分包,如2^24-1,分成下述两个包。

0xfffffff 0x00 mysql包内容
0x000000 0x01 mysql包内容

mysql包序号就是一个完整流程的发包序号,就是由该流程的发出的第一包是从0x00开始的,以后不管回复的包还是分包的包都会在上面加1,直到包序号达到0xff,再从0x001开始计数。

比如我要查询语句"select * from 某表",那么我会发送出第一个包含查询语句"select * from 某表"的mysql包给mysql数据库,这个包的序号是0x00,这时,流程开始,以后的mysql数据库回复的包都会从0x01开始计数,直到回复结束,这时,该流程就结束了。我要查询新的语句就代表新的流程开始,mysql包序号计数重新从0x00开始。

参考网址 http://dev.mysql.com/doc/internals/en/describing-packets.html#type-string.var_len

http://dev.mysql.com/doc/internals/en/mysql-packet.html

mysql交互协议解析——mysql包基础数据、mysql包基本格式的更多相关文章

  1. 使用canal通过mysql复制协议从binlog实现热数据nosql缓存(1)

    binlog: mysql在运行过程中执行的DML(增删改)操作都会以二进制形式记录在binlog中 canal server: canal server作为从数据库(slave)向主数据库发送dum ...

  2. 使用canal通过mysql复制协议从binlog实现热数据nosql缓存(2)

    开启mysql binlog功能 以5.7版本为例,找到/etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] pid-file = /var/run/mysqld/m ...

  3. Mysql DBA 运维 MySQL数据库索引优化及数据丢失案例 MySQL备份-增量备份及数据恢复基础实战 MySQL数据库生产场景核心优化

    需要的联系我,QQ:1844912514

  4. Mysql binlog日志解析

    1. 摘要: Mysql日志抽取与解析正如名字所将的那样,分抽取和解析两个部分.这里Mysql日志主要是指binlog日志.二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根 ...

  5. MySQL 通讯协议

    Client/Server 通讯协议用于客户端链接.代理.主备复制等,支持 SSL.压缩,在链接阶段进行认证,在执行命令时可以支持 Prepared Statements 以及 Stored Proc ...

  6. 深入解析MySQL replication协议

    Why 最开始的时候,go-mysql只是简单的抽象mixer的代码,提供一个基本的mysql driver以及proxy framework,但做到后面,笔者突然觉得,既然研究了这么久mysql c ...

  7. MySQL:基础—数据分组

    MySQL:基础-数据分组 1.为什么要分组: 比如一个表中有多条订单记录,如上图,每条记录对应着一个商品,现在我要查询 每个商品被订购的单数 准备出货?也就是找到每个商品被订购的数量. 如果只找一个 ...

  8. Shell基础:Shell和Mysql交互

    通过命令行和Mysql交互 [root]#mysql -uroot -p123 -e "show databases"   -e: execute: 执行数据库命令 通过脚本和数据 ...

  9. Vc数据库编程基础MySql数据库的表增删改查数据

    Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...

随机推荐

  1. MIP改造常见问题二十问

    在MIP推出后,我们收到了很多站长的疑问和顾虑.我们将所有疑问和顾虑归纳为以下二十个问题,希望对大家理解 MIP 有帮助. 1.MIP 化后对其他搜索引擎抓取收录以及 SEO 的影响如何? 答:在原页 ...

  2. 前端学HTTP之报文首部

    前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...

  3. JavaWeb——Servlet

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...

  4. 《如何使用Javascript判断浏览器终端设备》

    WEB开发中如何通过Javascript来判断终端为PC.IOS(iphone).Android呢? 可以通过判断浏览器的userAgent,用正则来判断手机是否是ios和Android客户端. va ...

  5. arcgis api for js入门开发系列六地图分屏对比(含源代码)

    上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...

  6. H3 BPM引擎API接口

    引擎API接口通过 Engine 对象进行访问,这个是唯一入口. 示例1:获取组织机构对象 this.Engine.Organization.GetUnit("组织ID"); 示例 ...

  7. Linux基础介绍【第八篇】

    Linux网络基础 网线 568A 568B 线序:橙白橙 绿白蓝 蓝白绿 棕白棕 交换机.路由器 交换机:DLINK.H3C.CISCO 交换机(Switch)是一种用于电信号转发的网络设备.它可以 ...

  8. Hello bokeyuan!

    一个学习技术的年轻人 从2016/09/03进入大学学习计算机科学与技术这门学科,我已经学习了4个月了,大学的生活很枯燥,很麻烦,很多事,与我想象中的大学有很大的区别.但是这都不会影响我想要成为一个技 ...

  9. <程序员从入门到精通> -- How

    定位 自己才是职业生涯的管理者,想清楚自己的发展路径: 远期的理想是什么?近期的规划是什么?今日的任务和功课又是什么? 今日之任务或功课哪些有助于近期之规划的实现,而近期之规划是否有利于远期之理想? ...

  10. Spring代理模式及AOP基本术语

    一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...