【997755.com澳门葡京】详解Mysql通信协议,mysql包为主格式

mysql交互协议是开荒mysql左近组件常用的议和,如JDBC,libmysql等等。

mysql交互协议是支付mysql周围组件常用的说道,如JDBC,libmysql等等。

mysql交互协议分析——mysql包基础数据、mysql包为主格式,mysql交互

mysql交互协议是付出mysql相近组件常用的协议,如JDBC,libmysql等等。

在此我们要认识到mysql交互协议其实是半双工的相互协议,至于缘何,那里就先挖个小坑,未来再填。

在追究mysql交互协议的格式此前,大家要清理二个小标题,就是mysql交互协议会用到的着力数据类型。

壹.平头类型

那里的整数类型能够用来表示mysql数据类型中的整数类型、日期时间档案的次序、DOUBLE、FLOAT类型、比特类型以及枚举类型等等。

负有的mysql整数类型都以小端的,那是网络数据的常规。即对于1六进制数0x1234567八,在仓库储存时会形成0x78563412

那便是说那里的平头数据类型有:int<len>(当中len =
一,2,三,肆,陆,八)以及可变的平头类型int<lenenc>

(1)int<len>是定位长度为len字节的平头数据,如int<三>表示数字三的话,会以小端
0x0两千0代表。

(贰)int<lenenc>是可变长度类型的平头,那种字符的长短能够是一, 3, 4,
玖。

  大家设要表示的数值是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来判断

  一)当type < 0xfb时,就觉着读取的数是type。

  二)当type ==
0xfc时,就读取前面包车型地铁int<二>,int<二>才是实事求是的数值。

  三)当type ==
0xfd时,就读取前边的int<三>,int<3>才是实际的数值。

  四)当type ==
0xfe时,就读取后边的int<八>,int<八>才是一心一意的数值。

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

   能够剧透下的是:

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

   如发送叁个安插命令失利后会有那种回复出现。

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

贰.字符串类型

此地的字符串类型能够用来代表mysql的高精度小数类型、字符串类型、大比特类型以及大整数类型等等。

这边的字符串类型重要是

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

(2)string<NUL> 正是string+’0x00′,那里的’0x00’是当做结尾符的。

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

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

(5)string<fix>和string<var>大约用不到。

三.mysql包为主格式

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

 

 

mysql包长度便是mysql包内容的尺寸,不把临沂即包长度和包序号计入mysql包长度中,一般是int<三>,假诺超越长度二^二肆-一,mysql会开始展览分包,如2^二4-壹,分成下述五个包。

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

 

 

 

mysql包序号正是贰个整机流程的发包序号,正是由该流程的发出的第3包是从0x00起头的,未来无论回复的包如故含有的包都会在上头加一,直到包序号到达0xff,再从0x00一开首计数。

比方说本人要查询语句”select * from
某表”,那么笔者会发送出第三个带有查询语句”select * from
某表”的mysql包给mysql数据库,那些包的序号是0x00,这时,流程开头,今后的mysql数据库回复的包都会从0x0壹开端计数,直到回复甘休,那时,该流程就与世长辞了。笔者要查询新的讲话就代表新的流水生产线伊始,mysql包序号计数重新从0x00初始。

 参考网站 

             

【997755.com澳门葡京】详解Mysql通信协议,mysql包为主格式。
mysql交互协议是付出mysql左近组件常用的商业事务,如JDBC,libmysql等等。
在此笔者…

详解Mysql通信协议,mysql通信协议

一.Mysql的连接格局

要询问Mysql的简报业协会议,首先必要领悟是以哪类连接格局去老是Mysql服务器的;Mysql的重地拉那接方式包罗:Unix套接字,内存共享,命名管道,TCP/IP套接字等。

1.1Unix套接字

在Linux和Unix景况下,能够利用Unix套接字举行Mysql服务器的总是;Unix套接字其实不是叁个网络协议,只幸亏客户端和Mysql服务器在同样台Computer上才能够运用,使用办法也很简短:

[email protected] ~]# mysql -uroot -proot
mysql> show variables like 'socket';
+---------------+---------------------------+
| Variable_name | Value      |
+---------------+---------------------------+
| socket  | /var/lib/mysql/mysql.sock |
+---------------+---------------------------+
1 row in set (0.00 sec)

如上命令查询Unix套接字文件的职位;

一.二命名管道和内部存款和储蓄器共享

在window系统中型大巴户端和Mysql服务器在平等台Computer上,能够动用命名管道和共享内部存款和储蓄器的艺术,

取名管道开启:–shared-memory=on/off;

共享内部存款和储蓄器开启:–enable-named-pipe=on/off;

1.3TCP/IP套接字

在任何系统下都得以选择的章程,也是使用最多的接连情势,本文要介绍的通信协议也是依靠此三番五次情势的,下边通过tcpdump对TCP/IP套接字有二个开首的摸底:

劳务器端:

[[email protected] ~]# tcpdump port 3306
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on venet0, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes

服务器端监听330六端口(也正是Mysql的端口);

客户端:

C:\Users\hui.zhao>mysql -h64.xxx.xxx.xxx -uroot -proot
mysql> exit
Bye

客户端连接服务器,然后断开连接,那时候观看服务器的监听结果日志:

[[email protected] ~]# tcpdump port 3306
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on venet0, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
02:06:25.442472 IP 153.3.251.202.33876 > root.mysql: Flags [S], seq 27289263, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
02:06:25.442763 IP root.mysql > 153.3.251.202.33876: Flags [S.], seq 2014324548, ack 27289264, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
02:06:25.617449 IP 153.3.251.202.33876 > root.mysql: Flags [.], ack 1, win 256, length 0
02:06:29.812946 IP root.mysql > 153.3.251.202.33876: Flags [P.], seq 1:57, ack 1, win 115, length 56
02:06:29.992362 IP 153.3.251.202.33876 > root.mysql: Flags [P.], seq 1:63, ack 57, win 256, length 62
02:06:29.992411 IP root.mysql > 153.3.251.202.33876: Flags [.], ack 63, win 115, length 0
02:06:29.992474 IP root.mysql > 153.3.251.202.33876: Flags [P.], seq 57:68, ack 63, win 115, length 11
02:06:30.166992 IP 153.3.251.202.33876 > root.mysql: Flags [P.], seq 63:100, ack 68, win 256, length 37
02:06:30.167109 IP root.mysql > 153.3.251.202.33876: Flags [P.], seq 68:158, ack 100, win 115, length 90
02:06:30.536298 IP 153.3.251.202.33876 > root.mysql: Flags [.], ack 158, win 256, length 0
02:06:34.568611 IP 153.3.251.202.33876 > root.mysql: Flags [P.], seq 100:105, ack 158, win 256, length 5
02:06:34.568620 IP 153.3.251.202.33876 > root.mysql: Flags [F.], seq 105, ack 158, win 256, length 0
02:06:34.568751 IP root.mysql > 153.3.251.202.33876: Flags [F.], seq 158, ack 106, win 115, length 0
02:06:34.743815 IP 153.3.251.202.33876 > root.mysql: Flags [.], ack 159, win 256, length 0

[S]:SYN发起连接标识,[P]:PUSH传送数据标识,[F]:FIN关闭连接标识,[.]:表示承认包;

能够差不多看出流程:建立tcp连接,客户端和Mysql服务器建立连接通信,关闭tcp连接;

[S][S.][.]那么些数据包表示tcp连接的二回握手;

[F.][F.][.]这多少个数据包表示tcp连接的九次挥手;

在那之中的几个[P.][.]实在正是客户端和Mysql服务器建立连接发送的磋商数据包。

贰.共谋分析

Mysql协议被用在Mysql Clients和Mysql
Server通信的时候,具体有以下多少个现象:客户端和服务器实行连接,Mysql代理以及基本备份;

MySQL客户端与服务器的互相主要分为五个品级:Connection
Phase(连接阶段也许叫认证阶段)和Command Phase(命令阶段);

组合tcpdump的输出,客户端和服务器端通信的总体育工作艺流程大概如下:

1.建立tcp连接三次握手;
2.与Mysql服务器建立连接,即Connection Phase(连接阶段或者叫认证阶段);
 s->c:发送握手初始化包(a Initial Handshake Packet)
 c->s:发送验证包(authentication response)
 s->c:服务器发送认证结果包
3.认证通过之后,服务器端接受客户端的命令包,发送相应的响应包,即Command Phase(命令阶段);
4.断开连接请求exit命令;
5.四次挥手tcp断开连接;

二.一主导项目

在全数协议中的基本项目:整数型和字符串型;

2.1.1整数型

分成三种类型Fixed-Length Integer Types和Length-Encoded Integer Type;

Fixed-Length Integer Types:

叁个固定长度的无符号整数将其值存款和储蓄在一名目多数字节中,具体固定字节数能够是:一,二,三,四,陆,八;

Length-Encoded Integer Type:

仓库储存需求的字节数取决于数值的轻重,具体可参看如下:

1个字节:0<=X<251;

2个字节:251<=X<2^16;

3个字节:2^16<=X<2^24;

9个字节:2^24<=X<2^64;

2.1.贰字符串型

分为5体系型包蕴,FixedLengthString,NullTerminatedString,VariableLengthString,LengthEncodedString和RestOfPacketString;

FixedLengthString:固定长度的字符串具备已知的硬编码长度,多个事例是ECRUISERLacrosse_Packet的SQL状态,它总是四个字节长;
NullTerminatedString:以境遇Null(字节为00)停止的字符串;

VariableLengthString:可变字符串,字符串的尺寸由另二个字段决定或在运营时总计,举例int+value,int为长度,value为钦点长度的字节数;

LengthEncodedString:以描述字符串长度的长度编码的平头作为前缀的字符串,是VariableLengthString钦定的int+value形式;

RestOfPacketString:倘若七个字符串是数据包的末尾叁个零部件,它的长度能够从全方位数据包长度减去当前岗位来计量;

2.二宗旨数据包

假设MySQL客户端或服务器想要发送数据,则:

各个数据包大小不可能超越二^二4字节(16MB);

在各类数据块前边加上二个数额许昌;

包格式如下:

int<3>:具体包内容的长度;除去int<3>+int<1>=4字节长度;
int<1>:sequence_id随每个数据包递增,并可能环绕。 它从0开始,在命令阶段开始一个新的命令时重置为0;
string<var>:具体数据内容,也是int<3>指定的长度;

例如:

0壹 00 00对应int表示具体多少内容的长短为一个字节;

997755.com澳门葡京,00对应int表示sequence_id;

0一对应string前面钦点的多寡内容为一个字节。

2.3报文类型

能够分成四个大类:登入认证报文,客户端请求报文以及服务器端重返报,基于mysql5.壹.73(mysql4.1后头的版本)

二.三.一记名认证报文

第3在竞相的验证阶段,由上文中能够清楚一齐分为八个级次:Handshake
Packet,authentication response以及结果包,那里重要分析前三个包;

2.3.1.1 Handshake Packet

1字节:协议版本号
NullTerminatedString:数据库版本信息
4字节:连接MySQL Server启动的线程ID
8字节:挑战随机数,用于数据库认证
1字节:填充值(0x00)
2字节:用于与客户端协商通讯方式
1字节:数据库的编码
2字节:服务器状态
13字节:预留字节
12字节:挑战随机数,用于数据库认证
1字节:填充值(0x00)

采用tcpdump举办监听,输出十陆进制日志如下:

[[email protected] ~]# tcpdump port 3306 -X
......
03:20:34.299521 IP root.mysql > 153.3.251.202.44658: Flags [P.], seq 1:57, ack 1, win 115, length 56
 0x0000: 4508 0060 09f1 4000 4006 c666 43da 9190 E..`[email protected]@..fC...
 0x0010: 9903 fbca 0cea ae72 bb4e 25ba 21e7 27e3 .......r.N%.!.'.
 0x0020: 5018 0073 b1e0 0000 3400 0000 0a35 2e31 P..s....4....5.1
 0x0030: 2e37 3300 4024 0000 5157 4222 252f 5f6f [email protected]$..QWB"%/_o
 0x0040: 00ff f708 0200 0000 0000 0000 0000 0000 ................
 0x0050: 0000 0032 4a5d 7553 7e45 784f 627e 7400 ...2J]uS~ExOb~t.

包的总厅长度是5陆,减去int<三>+int<一>4字节=5二字节,对应的十6进制正是3四;int<三>十6进制为3400
00代表包内容长度,int<一>十6进制为00意味着sequence_id;后续的始末就是包体内容共5二字节,0a对应的10进制是拾,全数协议号版本是十;后续的数据库版本音信碰到00甘休,35
贰e3一 二e3七 33对应的5.壹.7三,正是当前采纳的数据库版本;402伍仟0对应10进制是643陆;0八意味着数据库的编码;0200意味服务器状态;后续的一三对00为预留字节;最后的壹二个字节是搦战随机数和填充钱。

2.3.1.2 Authentication Packet

4字节:用于与客户端协商通讯方式
4字节:客户端发送请求报文时所支持的最大消息长度值
1字节:标识通讯过程中使用的字符编码
23字节:保留字节
NullTerminatedString:用户名
LengthEncodedString:加密后的密码
NullTerminatedString:数据库名称(可选)

使用tcpdump进行监听,输出十6进制日志如下:

03:20:34.587416 IP 153.3.251.202.44658 > root.mysql: Flags [P.], seq 1:63, ack 57, win 256, length 62
 0x0000: 4500 0066 29ee 4000 7006 766b 9903 fbca E..f)[email protected]
 0x0010: 43da 9190 ae72 0cea 21e7 27e3 bb4e 25f2 C....r..!.'..N%.
 0x0020: 5018 0100 d8d2 0000 3a00 0001 85a6 0f00 P.......:.......
 0x0030: 0000 0001 2100 0000 0000 0000 0000 0000 ....!...........
 0x0040: 0000 0000 0000 0000 0000 0000 726f 6f74 ............root
 0x0050: 0014 ff58 4bd2 7946 91a0 a233 f2c1 28af ...XK.yF...3..(.
 0x0060: d578 0762 c2e8       .x.b..

包的总省长度是6二,减去int<三>+int<壹>四字节=5八字节,对应的十陆进制就是三a;int<三>十陆进制为三a00
00代表包内容长度;int<一>十6进制为01意味着sequence_id;7二陆f 陆f74
00是用户名解码后是root;前边是加密后的密码类型是

LengthEncodedString,1四应和的十进制是20,前面二十一个字节正是加密后的密码;可选的数据库名称不存在。

贰.4客户端请求报文

int<1>:执行的命令,比如切换数据库
string<var>:命令相应的参数

指令列表:

0x00 COM_SLEEP (内部线程状态)
0x01 COM_QUIT 关闭连接
0x02 COM_INIT_DB 切换数据库
0x03 COM_QUERY SQL查询请求
0x04 COM_FIELD_LIST 获取数据表字段信息
0x05 COM_CREATE_DB 创建数据库
0x06 COM_DROP_DB 删除数据库
0x07 COM_REFRESH 清除缓存
0x08 COM_SHUTDOWN 停止服务器
0x09 COM_STATISTICS 获取服务器统计信息
0x0A COM_PROCESS_INFO 获取当前连接的列表
0x0B COM_CONNECT (内部线程状态)
0x0C COM_PROCESS_KILL 中断某个连接
0x0D COM_DEBUG 保存服务器调试信息
0x0E COM_PING 测试连通性
0x0F COM_TIME (内部线程状态)
0x10 COM_DELAYED_INSERT (内部线程状态)
0x11 COM_CHANGE_USER 重新登陆(不断连接)
0x12 COM_BINLOG_DUMP 获取二进制日志信息
0x13 COM_TABLE_DUMP 获取数据表结构信息
0x14 COM_CONNECT_OUT (内部线程状态)
0x15 COM_REGISTER_SLAVE 从服务器向主服务器进行注册
0x16 COM_STMT_PREPARE 预处理SQL语句
0x17 COM_STMT_EXECUTE 执行预处理语句
0x18 COM_STMT_SEND_LONG_DATA 发送BLOB类型的数据
0x19 COM_STMT_CLOSE 销毁预处理语句
0x1A COM_STMT_RESET 清除预处理语句参数缓存
0x1B COM_SET_OPTION 设置语句选项
0x1C COM_STMT_FETCH 获取预处理语句的执行结果

举个例子:use test;使用tcpdump进行监听,输出十6进制日志如下:

22:04:29.379165 IP 153.3.251.202.33826 > root.mysql: Flags [P.], seq 122:131, ack 222, win 64019, length 9
 0x0000: 4500 0031 3f19 4000 7006 6175 9903 fbca E..1?[email protected]
 0x0010: 43da 9190 8422 0cea 42e2 524b 7e18 25c1 C...."..B.RK~.%.
 0x0020: 5018 fa13 a07b 0000 0500 0000 0274 6573 P....{.......tes
 0x0030: 74

包的总司长度是玖,减去int<三>+int<一>肆字节=5字节,对应的十6进制正是0伍;int<叁>十6进制为0500
00象征包内容长度;int<一>十六进制为00代表sequence_id;02对应COM_INIT_DB,前面是test的二进制编码;

2.5服务器响应报文

对于客户端发送给服务器的多数下令,服务器重临个中二个响应的多寡包:OK_Packet,ERR_Packet和EOF_Packet,Result
Set;

2.5.1OK_Packet

代表成功达成三个限令,具体格式如下:

int<1>:0x00或0xFEOK包头
int<lenenc>:受影响行数
int<lenenc>:最后插入的索引ID
int<2>:服务器状态
int<2>:告警计数 注:MySQL 4.1 及之后的版本才有
string<lenenc>:服务器消息(可选)

use test;服务器重临的包,使用tcpdump进行监听,输出十六进制日志如下:

22:04:29.379308 IP root.mysql > 153.3.251.202.33826: Flags [P.], seq 222:233, ack 131, win 14600, length 11
 0x0000: 4508 0033 4a0a 4000 4006 867a 43da 9190 [email protected]@..zC...
 0x0010: 9903 fbca 0cea 8422 7e18 25c1 42e2 5254 ......."~.%.B.RT
 0x0020: 5018 3908 3b61 0000 0700 0001 0000 0002 P.9.;a..........
 0x0030: 0000 00

包的总委员长度是1一,减去int<3>+int<1>四字节=7字节,对应的十陆进制正是0七;int<3>十6进制为0700
00意味着包内容长度;int<一>十6进制为0一意味sequence_id;00意味着新乡;00意味着受影响行数;00意味最终插入的索引ID;0200意味服务器状态;

2.5.2ERR_Packet

意味着发生了不当,具体格式如下:

int<1>:0xFF ERR包头
int<2>:错误码
string[1]:Sql状态标识 注:MySQL 4.1 及之后的版本才有
string[5]:Sql状态  注:MySQL 4.1 及之后的版本才有
string<EOF>:错误消息

2.5.3EOF_Packet

以标识查询实践结果的利落:

int<1>:EOF值(0xFE)
int<2>:告警计数 注:MySQL 4.1 及之后的版本才有
int<2>:状态标志位 注:MySQL 4.1 及之后的版本才有

2.5.4Result Set

当客户端发送查询请求后,在一贯不不当的景况下,服务器会回去结果集(Result
Set)给客户端,1共有多少个部分:

Result Set Header  返回数据的列数量
Field     返回数据的列信息(多个)
EOF      列结束
Row Data    行数据(多个)
EOF      数据结束

2.5.4.1Result Set Header

Length-Encoded Integer Field结构的数量
Length-Encoded Integer 额外信息

2.5.4.2Field

LengthEncodedString  目录名称
LengthEncodedString  数据库名称
LengthEncodedString  数据表名称
LengthEncodedString  数据表原始名称
LengthEncodedString  列(字段)名称
LengthEncodedString  列(字段)原始名称
int<1>     填充值
int<2>     字符编码
int<4>     列(字段)长度
int<1>     列(字段)类型
int<2>     列(字段)标志
int<1>     整型值精度
int<2>     填充值(0x00)
LengthEncodedString  默认值

2.5.4.3EOF

参考2.5.3EOF_Packet

2.5.4.4Row Data

LengthEncodedString  字段值
......     多个字段值

实例分析,表音讯如下:

CREATE TABLE `btest` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `age` int(11) DEFAULT NULL,
 `name` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8

select * from btest;服务器重临的多寡如下:

mysql> select * from btest;
+----+------+---------+
| id | age | name |
+----+------+---------+
| 1 | 10 | zhaohui |
| 2 | 11 | zhaohui |
+----+------+---------+

服务器重回的包,使用tcpdump进行监听,输出十6进制日志如下:

01:54:21.522660 IP root.mysql > 153.3.251.202.58587: Flags [P.], seq 1:196, ack 24, win 115, length 195
 0x0000: 4508 00eb 8839 4000 4006 4793 43da 9190 [email protected]@.G.C...
 0x0010: 9903 fbca 0cea e4db 9dd8 0216 eda6 f730 ...............0
 0x0020: 5018 0073 ca34 0000 0100 0001 0328 0000 P..s.4.......(..
 0x0030: 0203 6465 6604 7465 7374 0562 7465 7374 ..def.test.btest
 0x0040: 0562 7465 7374 0269 6402 6964 0c3f 0014 .btest.id.id.?..
 0x0050: 0000 0008 0342 0000 002a 0000 0303 6465 .....B...*....de
 0x0060: 6604 7465 7374 0562 7465 7374 0562 7465 f.test.btest.bte
 0x0070: 7374 0361 6765 0361 6765 0c3f 000b 0000 st.age.age.?....
 0x0080: 0003 0000 0000 002c 0000 0403 6465 6604 .......,....def.
 0x0090: 7465 7374 0562 7465 7374 0562 7465 7374 test.btest.btest
 0x00a0: 046e 616d 6504 6e61 6d65 0c21 00fd 0200 .name.name.!....
 0x00b0: 00fd 0000 0000 0005 0000 05fe 0000 2200 ..............".
 0x00c0: 0d00 0006 0131 0231 3007 7a68 616f 6875 .....1.10.zhaohu
 0x00d0: 690d 0000 0701 3202 3131 077a 6861 6f68 i.....2.11.zhaoh
 0x00e0: 7569 0500 0008 fe00 0022 00    ui.......".

0328 0000 0贰对应的是Result Set Header,03代表一个字段;0三 6465
6六对应的是目录名称的暗许值def,0三意味着后边的字节数为3;0四 7四6五 737肆

对应的是数据库名称test;056二 7四陆伍 737四相应的是多少表名称btest;0562 7465
737四应和的是数据表原始名称btest;0269 6肆对应字段名称id;02
6964对应列(字段)原始名称id;0c3f 00对应的是填充钱和字符编码;14 0000
00对应的10进制是20象征列(字段)长度;0捌 0342
00个别表示列(字段)类型,标志,整型值精度;0000二个字节为填充钱;00为暗中认可值表示空的;

接轨的age和name字段同上,不在重复;

013一类型LengthEncodedString对应的字符1正是id的值;0231
30门类LengthEncodedString对应的字符十就是age的值;0七 7a6捌 61六f 6875
6玖项目LengthEncodedString对应的字符zhaohui正是name的值;

以上便是大家给我们整理的有关MYSQL通信协议相关的全体内容,大家在上学的时候如若还有其余不掌握的地方能够留言给大家,感激你对帮客之家的帮助。

一.Mysql的延续形式要打听Mysql的报纸发表协议,首先须求知道是以哪类连接形式去老是Mysql服务器的;Mysql的重要…

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

在此大家要认知到mysql交互协议其实是半双工的互相协议,至于为啥,那里就先挖个小坑,未来再填。

在追究mysql交互协议的格式在此以前,大家要清理1个小题目,便是mysql交互协议会用到的基本数据类型。

在探讨mysql交互协议的格式以前,我们要理清三个小标题,就是mysql交互协议会用到的主干数据类型。

一.整数项目

壹.整数品种

此地的平头类型能够用来代表mysql数据类型中的整数类型、日期时间项目、DOUBLE、FLOAT类型、比特类型以及枚举类型等等。

此间的整数类型可以用来代表mysql数据类型中的整数类型、日期时间等级次序、DOUBLE、FLOAT类型、比特类型以及枚举类型等等。

不无的mysql整数类型都以小端的,那是网络数据的老规矩。即对于16进制数0x1234567八,在仓库储存时会产生0x7856341二

富有的mysql整数类型都以小端的,这是网络数据的惯例。即对于1陆进制数0x1234567八,在蕴藏时会造成0x78563412

那么那里的整数数据类型有:int<len>(当中len =
1,2,三,肆,六,八)以及可变的整数类型int<lenenc>

那么那里的整数数据类型有:int<len>(当中len =
1,二,叁,四,陆,8)以及可变的整数类型int<lenenc>

(壹)int<len>是一定长度为len字节的整数数据,如int<三>表示数字三的话,会以小端
0x0三千0表示。

(一)int<len>是定位长度为len字节的整数数据,如int<3>表示数字3的话,会以小端
0x0三千0代表。

(二)int<lenenc>是可变长度类型的平头,那种字符的长短能够是一, 三, 四,
九。

(2)int<lenenc>是可变长度类型的平头,那种字符的尺寸能够是1, 叁, 四,
玖。

  大家设要代表的数值是n

  大家设要代表的数值是n

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

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

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

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

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

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

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

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

  那就代表假设我们相遇int<lenenc>类型,大家需求先读取第3个数值type来判别

  那就代表1旦大家相见int<lenenc>类型,大家需求先读取第多少个数值type来剖断

  一)当type < 0xfb时,就觉着读取的数是type。

  一)当type < 0xfb时,就感到读取的数是type。

  2)当type ==
0xfc时,就读取前边的int<贰>,int<二>才是真心真意的数值。

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

  三)当type ==
0xfd时,就读取前面包车型客车int<三>,int<三>才是真性的数值。

  3)当type ==
0xfd时,就读取前面包车型大巴int<三>,int<三>才是动真格的的数值。

  肆)当type ==
0xfe时,就读取后边的int<八>,int<八>才是真正的数值。

  4)当type ==
0xfe时,就读取后边的int<八>,int<八>才是动真格的的数值。

 那么当type为0xff和0xfb是怎么着?那边挖坑在此之后再填。

 那么当type为0xff和0xfb是何等?那边挖坑在此之后再填。

   能够剧透下的是:

   能够剧透下的是:

   0xff在mysql交互协议中貌似代表某三个动作错误,

   0xff在mysql交互协议中貌似代表某1个动作错误,

   如发送1个安排命令失利后会有那种回复出现。

   如发送三个插入命令失利后会有那种回复出现。

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

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

2.字符串类型

贰.字符串类型

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

那里的字符串类型能够用来代表mysql的高精度小数类型、字符串类型、大比特类型以及大整数类型等等。

此处的字符串类型首要是

那边的字符串类型主假诺

(壹)string<len>正是长度为len的字符串。

(一)string<len>正是长度为len的字符串。

(二)string<NUL> 正是string+’0x00′,那里的’0x00’是当做结尾符的。

(二)string<NUL> 正是string+’0x00′,那里的’0x00’是当做结尾符的。

(3)string<lenenc>便是int<lenenc>
+string,int<lenenc> 代表字符串的尺寸。

(三)string<lenenc>正是int<lenenc>
+string,int<lenenc> 代表字符串的长短。

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

(肆)string<EOF>就是在叁个mysql交互包结尾处出现的字符串。换言之,那几个字符串是一个mysql交互包的末尾三个字符串。

(5)string<fix>和string<var>大约用不到。

(伍)string<fix>和string<var>大概用不到。

3.mysql包为主格式

3.mysql包为主格式

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

 

 

 

 

mysql包长度正是mysql包内容的长短,不把邢台即包长度和包序号计入mysql包长度中,一般是int<三>,假设赶过长度二^二肆-1,mysql会议及展览开分包,如2^二四-一,分成下述多个包。

mysql包长度正是mysql包内容的长短,不把淮安即包长度和包序号计入mysql包长度中,一般是int<三>,假诺超越长度二^二四-一,mysql会实行分包,如2^2四-一,分成下述七个包。

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

 

 

 

 

 

 

mysql包序号正是贰个完全流程的发包序号,正是由该流程的爆发的首先包是从0x00起首的,以往无论回复的包仍旧含有的包都会在地点加一,直到包序号达到0xff,再从0x00一开首计数。

mysql包序号正是1个完整流程的发包序号,正是由该流程的发出的首先包是从0x00伊始的,以往无论回复的包照旧饱含的包都会在上头加一,直到包序号达到0xff,再从0x001初始计数。

譬如说笔者要查询语句”select * from
某表”,那么小编会发送出第3个饱含查询语句”select * from
某表”的mysql包给mysql数据库,这几个包的序号是0x00,那时,流程初始,今后的mysql数据库回复的包都会从0x0一起初计数,直到回复甘休,那时,该流程就停止了。小编要查询新的说话就表示新的流程开头,mysql包序号计数重新从0x00初叶。

譬如本人要查询语句”select * from
某表”,那么小编会发送出第1个饱含查询语句”select * from
某表”的mysql包给mysql数据库,这几个包的序号是0x00,那时,流程早先,现在的mysql数据库回复的包都会从0x0一开头计数,直到回复结束,这时,该流程就过逝了。笔者要询问新的讲话就表示新的流水生产线起先,mysql包序号计数重新从0x00开端。

 参考网站 

 参考网站 

             

             

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website