mysql交互协议解析——mysql包基础数据、mysql包…
2018-06-17 23:11:06来源:未知 阅读 ()
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
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:前端学数据库之数据类型
下一篇:Navicat常用快捷键
- MySQL replace函数怎么替换字符串语句 2020-03-09
- PHP访问MySQL查询超时怎么办 2020-03-09
- mysql登录时闪退 2020-02-27
- MySQL出现1067错误号 2020-02-27
- mysql7.x如何单独安装mysql 2020-02-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash