作家
登录

关于MySQL的网络协议分析

作者: 来源: 2017-12-01 15:40:19 阅读 我要评论

'....' 

比如我如今执履行下面的语句:

Error 包

Error 包的重要构造:

相对包内容的地位 长度(字节) 名称 描述 0 1 包头标识 0xFF 代表这是一个Error 包 1 2 缺点代码 该缺点的响应缺点代码 3 1 标识位 SQL履行状况标识位,用'#'进行标识 4 5 履行状况 SQL的具体履行状况 9 msg_len 缺点信息 具体的缺点信息

比如我们如今已经连接了数据库,履行

  1. use test_database;  

然则我们数据库中并没有test_database这个数据库,我们将会获得响应的缺点信息,下面是我本机解析的Error packet包,仅供参考:

EOF Packet

EOF Packet是用于标识某个阶段数据停止的标记包,会在一下几种情况中产生:

  • 结不雅集中字段信息停止的时刻;
  • 结不雅集中列信息停止的时刻;
  • 办事器确认停止办事的时刻;
  • 客户端发送COM_SET_OPTION and COM_DEBUG敕令后,办事器回应的时刻;
  • 办事器请求应用MySQL4.1版本之前的认证方法的时刻; 

EOF 包的重要构造:

相对包内容的地位 长度(字节) 名称 描述 0 1 包头标识 0xFE 代表这是一个EOF 包 1 2 警告数 前次敕令引起的警告数 3 2 办事器状况

这里要留意的一点,我们膳绫擎分析了Data Field的构造,发明它是用0xFE作为长度须要8个字节编码值得标识头,所以我们在断定一个包是否是EOF 包的时刻,须要下面两个前提:

  • 标识头(第一个字节)为0xFE;
  • 包的总长度小于9个字节; 

Result Set包

Result Set包产生于我们每次数据库履行须要返回结不雅集的时刻,Server端发送给我们的包,比如平常的SELECT,SHOW等敕令,Result Set包比拟较较复杂,重要包含以下五个方面:

内容 含义 Result Set Header 返回数据的列数量 Field 返回数据的列信息若干好多个) EOF 列停止 Row Data 行数据若干好多个) EOF 数据停止

我们逐个来分析,起首我们来看Result Set Header。

Result Set Header

Result Set Header表示返回数据的列数量以及一些额外的信息,其重要构造为:

长度 含义 1-9字节 数据的列数量(LengthEncodedInteger编码格局) 1-9字节 额外信息(LengthEncodedInteger编码格局)

Field

Field表示Result Set中数据列的具体信息,可出现多次,具体次数取决于Result Set Header中数据的列数量,它的重要构造为:

长度 含义 4 平日为ASCIIz字符串def
  1.     | 数据库名称(Data Field)
  2.     | 假如萌芽指定了表别号,就是表别号(Data Field)
  3.     | 原始的表名(Data Field)
  4.     | 假如萌芽指定了列别号,就是列别号(Data Field)
  5.     | 原始的列名(Data Field) 

1 | 标识位,平日为12,表示接下去的12个字节是具体的field内容

  1. PSOK{statementId=1, columns=5, parameters=1}  

2 | field的编码

4 | field的长度

1 | field的类型

2 | field的标识

2 | field值的的小数点精度

2 | 预留字节

  | 可选元素,如不雅存在,则表示该field的默认值

固然收集中的数据是用字节传输的,但它背后的数据源都是有类型的数据,MySQL协定也有根本的数据类型,比如Java中的8种根本数据类型,但MySQL协定中简单的多,它只有两种根本数据类型,分别为Integer(整型),String(字符串),下面我们就来看看这两种类型。

例子 解释

个中field的类型与标识具体定义和对应变量含义可参考这篇文┞仿:MySQL协定分析

EOF 包

数据库账户认证阶段

这里的EOF包是标识这列信息的停止,具体构造信息参考膳绫擎的EOF包解释。

Row Data

EOF 包

等待Row Data发送完之后,Server最后会向Client端发送一个EOF包,标识所有的行数据已经发送完毕。

PREPARE_OK包 

PREPARE_OK包产生在Client端向Server发送预处理SQL语句,Server进行精确回应的时刻,大年夜家写写Java的时刻肯定用过PreparedStatement,这里PreparedStatement的功能就是进行SQL的预处理,预处理的长处比较多,比如效力高,防SQL注入等,有兴趣的同窗可以本身去进修下。下面是PREPARE_OK包的构造:


  推荐阅读

  CentOS 7中安装Mysql 5.7的注意事项

CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了alter user user() identified by 'admin'; 这几天因为做项目须要,要应用MySQL数据库,应用的是MySQL Community Server 5.7.>>>详细阅读


本文标题:关于MySQL的网络协议分析

地址:http://www.17bianji.com/lsqh/39379.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)