作家
登录

关于MySQL的网络协议分析

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

长度 含义 1 0x00(标识是一个OK包) 4 statement_handler_id(预处理语句id) 2 number of columns in result set(结不雅集中列的数量) 2 number of parameters in query(萌芽语句中参数的数量) 1 0x00 (填充值) 2 警告数
  1. PreparedStatement ps = connection.prepareStatement("SELECT * FROM `godpan_fans` where id=?"); 
  2.  
  3. ps.setInteger(1, 1); 
  4.  
  5. ps.executeQuery();  

获得下面的PREPARE_OK包,仅供参考:

如不雅膳绫擎的columns大年夜于0,以及parameters大年夜于0,则将有额外的两个包传输,分别是columns的信息以及parameters的信息,对应信息构造:

内容 含义 Field columns信息若干好多个) EOF columns信息停止 Field parameters若干好多个) EOF parameters停止

到此全部PREPARE_OK包发送完毕。

Row Data Binary

这个包跟膳绫擎提到的Row Data包有什么差别呢?重要有两点:

  • 用不合的方法定义NULL;
  • 数据编码不再纯真的应用LengthEncodedString,而是根据数据类型的不合进行响应的编码; 

后面我会分别解释这两点,我们先来看看它的构造:

相对包内容的地位 长度(字节) 名称 描述 0 1 包头标识 0x00 1 (col_count+7+2)/8 Null Bit Map 前两位为预留字节,重要用于差别与其他的几种包(OK,ERROR,EOF),在MySQL 5之后这两个字节都为0X00,个中col_count为列的数量 (col_count+7+2)/8 + 1 n column values 具体的列值,反复多次,根据值类型编码

Handshake packet

如今我们来看一下它的两个特点,起首我们来看它是若何来定义NULL的,起首我们看到他的构造中有一个Null Bit Map,除去两个标识位,真正用于标识数据信息的就是(col_count+7)/8位字节,这里我先给出结论,后面再给大年夜家具体分析:

参数个数 长度(字节) 具体值范围 描述 1-8 1 -1, 2^n组合 1 = 2^0表示第一个参数为NULL,3 = 2^0 + 2^1表示第一个和第二参数为NULL...

膳绫擎给出了标识NULL的根本算法,原则是哪个参数(次序为n)为NULL,则Null Bit Map响应的值加上2^n,8个参数为一个周期,以词攀类推。

接着我们来看一下第二点,是若何器具体值类型来对响应的值进行编码的,这里重要分为三类,根本数据类型,时光类型,字符串类型;

  • 根本数据类型:比如TINYINT应用一个字节编码,FLOAT应用四个字节,DOUBLE应用8个字节等;
  • 时光类型:应用类似LengthEncodedString的编码方法编码,具体可参考MySQL_PROTOCOL;
  • 字符串类:不属于膳绫擎两类的都属于字符串类型,应用通俗的LengthEncodedString; 

Execute包

Execute包顾名思义是一个履行包,它是由Client端发送到Server端的,但它和通俗的敕令又有点不合,它主如果用来履行预处理语句,并会携带响应参数,具体构造如下:

长度 含义 1 COM_EXECUTE(标识是一个Execute包) 4 预处理语句id 1 游标类型 4 预留字节 0 接下去的内容只有在有参数的情况下 (param_count+7)/8 null_bit_map(描述参数中NULL的情况) 1 参数绑定情况 n*2 参数类型(依次存储) n 参数具体值(非NULL)(依次存储,应用Row Data Binary方法编码)

Execute包大年夜Client端发送到Server端后可能会获得以下几个结不雅:

  • OK包
  • ERROR包
  • Result Set包(可能多个) 

其实重要就是两步,Client将履行敕令编码成Server请求的格局传输给Server端履行,Server端将履行结不雅传输给Client端,Client端再根据响应的数据包格局解析获得所需的数据。

我们须要根据包的不合类型来进行不合的处理。

总结 

  1. Error{errno=1046, sqlState='3D000', message='No database selected' 

  2.   推荐阅读

      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)