mysql交互协议解析——mysql包基础数据、mysql包基本格式
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包基本格式的更多相关文章
- 使用canal通过mysql复制协议从binlog实现热数据nosql缓存(1)
binlog: mysql在运行过程中执行的DML(增删改)操作都会以二进制形式记录在binlog中 canal server: canal server作为从数据库(slave)向主数据库发送dum ...
- 使用canal通过mysql复制协议从binlog实现热数据nosql缓存(2)
开启mysql binlog功能 以5.7版本为例,找到/etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] pid-file = /var/run/mysqld/m ...
- Mysql DBA 运维 MySQL数据库索引优化及数据丢失案例 MySQL备份-增量备份及数据恢复基础实战 MySQL数据库生产场景核心优化
需要的联系我,QQ:1844912514
- Mysql binlog日志解析
1. 摘要: Mysql日志抽取与解析正如名字所将的那样,分抽取和解析两个部分.这里Mysql日志主要是指binlog日志.二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根 ...
- MySQL 通讯协议
Client/Server 通讯协议用于客户端链接.代理.主备复制等,支持 SSL.压缩,在链接阶段进行认证,在执行命令时可以支持 Prepared Statements 以及 Stored Proc ...
- 深入解析MySQL replication协议
Why 最开始的时候,go-mysql只是简单的抽象mixer的代码,提供一个基本的mysql driver以及proxy framework,但做到后面,笔者突然觉得,既然研究了这么久mysql c ...
- MySQL:基础—数据分组
MySQL:基础-数据分组 1.为什么要分组: 比如一个表中有多条订单记录,如上图,每条记录对应着一个商品,现在我要查询 每个商品被订购的单数 准备出货?也就是找到每个商品被订购的数量. 如果只找一个 ...
- Shell基础:Shell和Mysql交互
通过命令行和Mysql交互 [root]#mysql -uroot -p123 -e "show databases" -e: execute: 执行数据库命令 通过脚本和数据 ...
- Vc数据库编程基础MySql数据库的表增删改查数据
Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...
随机推荐
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- tLinux 2.2下安装Mono 4.8
Tlinux2.2发行版基于CentOS 7.2.1511研发而成,内核版本与Tlinux2.0发行版保持完全一致,更加稳定,并保持对Tlinux2.0的完全兼容.Mono 4版本要求CentOS 7 ...
- 移动web基本知识
1.pixel像素基础 1.px:csspixel 逻辑像素,浏览器所使用的抽象单位 2.dp,pt:设备无关像素 3.devicePixelPatio 设备像素缩放比例 2.viewport 1. ...
- css样式之border-radius
border-radius 属性设置边框的园角 可能的值:像素,百分比 扩展延伸 html代码 <div></div> css代码 div { height: 200px; w ...
- Function.prototype.toString 的使用技巧
Function.prototype.toString这个原型方法可以帮助你获得函数的源代码, 比如: function hello ( msg ){ console.log("hello& ...
- 说说BPM数据表和日志表中几个状态字段的详细解释
有个客户说需要根据这些字段的值作为判断条件做一些定制化需求,所以需要知道这些字段的名词解释,以及里面存储的值具体代表什么意思 我只好为你们整理奉上这些了! Open Work Sheet 0 Sav ...
- iOS系列教程 目录 (持续更新...)
前言: 听说搞iOS的都是高富帅,身边妹子无数.咱也来玩玩.哈哈. 本篇所有内容使用的是XCode工具.Swift语言进行开发. 我现在也是学习阶段,每一篇内容都是经过自己实际编写完一遍之后,发现 ...
- 鱼眼模式(Fisheye projection)的软件实现
简单实现 鱼眼模式(Fisheye)和普通的透视投影(Perspective projection),一个很大的区别就是鱼眼的投影算法是非线性的(non-linear),实际照相机的情况是在镜头外面包 ...
- 【原】npm 常用命令详解
今年上半年在学习gulp的使用,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令到自己博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块 ...
- 一步步开发自己的博客 .NET版(1、基本显示)
前言 我们每个猿都有一个搭建自己独立博客的梦,我也不例外.以前想 现在想 以后也想.之所以一直迟迟没有着手,是因为难以跨出第一步.每次心里想着,等我以后技术好了再说,然后就没有然后了.以前用过word ...