mysql 协议的OK包及解析
git
https://github.com/sea-boat/mysql-protocol
概况
mysql客户端与mysql服务端交互过程中,当服务端完成客户端的某命令时则会返回OK包。
mysql通信报文结构
类型 | 名字 | 描述 |
---|---|---|
int<3> | payload长度 | 按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头 |
int<1> | 序列号 | |
string | payload | 报文体,长度即为前面指定的payload长度 |
OK包
Payload
Type | Name | Description |
---|---|---|
int<1> | header | [00] or [fe] the OK packet header |
int | affected_rows | affected rows |
int | last_insert_id | last insert-id |
if capabilities & CLIENT_PROTOCOL_41 { | ||
int<2> | status_flags | Status Flags |
int<2> | warnings | number of warnings |
}elseif capabilities & CLIENT_TRANSACTIONS { | ||
int<2> | status_flags | Status Flags |
} | ||
if capabilities & CLIENT_SESSION_TRACK { | ||
string | info | human readable status information |
if status_flags & SERVER_SESSION_STATE_CHANGED | ||
string | session_state_changes | session state info |
} | ||
} else { | ||
string | info | human readable status information |
} |
更多详情 : http://dev.mysql.com/doc/internals/en/packet-OK_Packet.html
Status Flags
Flag | Value |
SERVER_STATUS_IN_TRANS | 0x0001 |
SERVER_STATUS_AUTOCOMMIT | 0x0002 |
SERVER_MORE_RESULTS_EXISTS | 0x0008 |
SERVER_STATUS_NO_GOOD_INDEX_USED | 0x0010 |
SERVER_STATUS_NO_INDEX_USED | 0x0020 |
SERVER_STATUS_CURSOR_EXISTS | 0x0040 |
SERVER_STATUS_LAST_ROW_SENT | 0x0080 |
SERVER_STATUS_DB_DROPPED | 0x0100 |
SERVER_STATUS_NO_BACKSLASH_ESCAPES | 0x0200 |
SERVER_STATUS_METADATA_CHANGED | 0x0400 |
SERVER_QUERY_WAS_SLOW | 0x0800 |
SERVER_PS_OUT_PARAMS | 0x1000 |
SERVER_STATUS_IN_TRANS_READONLY | 0x2000 |
SERVER_SESSION_STATE_CHANGED | 0x4000 |
OK包操作
- OK包类
/*** * @author seaboat* @date 2016-09-25* @version 1.0* <pre><b>email: </b>849586227@qq.com</pre>* <pre><b>blog: </b>http://blog.csdn.net/wangyangzhizhou</pre>* <p>mysql ok packet.</p>*/
public class OKPacket extends MySQLPacket {public static final byte HEADER = 0x00;public static final byte[] OK = new byte[] { 7, 0, 0, 1, 0, 0, 0, 2, 0, 0,0 };public byte header = HEADER;public long affectedRows;public long insertId;public int serverStatus;public int warningCount;public byte[] message;public void read(byte[] data) {MySQLMessage mm = new MySQLMessage(data);packetLength = mm.readUB3();packetId = mm.read();header = mm.read();affectedRows = mm.readLength();insertId = mm.readLength();serverStatus = mm.readUB2();warningCount = mm.readUB2();if (mm.hasRemaining()) {this.message = mm.readBytesWithLength();}}public void write(ByteBuffer buffer) {BufferUtil.writeUB3(buffer, calcPacketSize());buffer.put(packetId);buffer.put(header);BufferUtil.writeLength(buffer, affectedRows);BufferUtil.writeLength(buffer, insertId);BufferUtil.writeUB2(buffer, serverStatus);BufferUtil.writeUB2(buffer, warningCount);if (message != null) {BufferUtil.writeWithLength(buffer, message);}}@Overridepublic int calcPacketSize() {int i = 1;i += BufferUtil.getLength(affectedRows);i += BufferUtil.getLength(insertId);i += 4;if (message != null) {i += BufferUtil.getLength(message);}return i;}@Overrideprotected String getPacketInfo() {return "MySQL OK Packet";}}
- 测试类
/*** * @author seaboat* @date 2016-09-25* @version 1.0* <pre><b>email: </b>849586227@qq.com</pre>* <pre><b>blog: </b>http://blog.csdn.net/wangyangzhizhou</pre>* <p>test ok packet.</p>*/
public class OKPacketTest {@Testpublic void produce() {OKPacket ok = new OKPacket();ok.packetId = 2;ok.affectedRows = 0;ok.insertId = 0;ok.serverStatus = 2;ok.warningCount = 0;ByteBuffer buffer = ByteBuffer.allocate(256);ok.write(buffer);buffer.flip();byte[] bytes = new byte[buffer.remaining()];buffer.get(bytes, 0, bytes.length);String result = HexUtil.Bytes2HexString(bytes);System.out.println(result);assertTrue(Integer.valueOf(result.substring(0, 2), 16) == result.length() / 2 - 4);OKPacket ok2 = new OKPacket();ok2.read(bytes);//auth okassertTrue(result.equals("0700000200000002000000"));}}
========广告时间========
鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。
为什么写《Tomcat内核设计剖析》
=========================
mysql 协议的OK包及解析相关推荐
- mysql eof_详细介绍mysql 协议的EOF包及解析
git https://github.com/sea-boat/mysql-protocol 概况 mysql的EOF包用于标明查询结果的结尾. mysql通信报文结构类型名字描述int<3&g ...
- mysql 协议的ResultsetRow包及解析
git https://github.com/sea-boat/mysql-protocol 概况 ResultsetRow包属于服务端返回ResultSet时的其中一部分包,用于描述结果集的行记录. ...
- mysql 协议的query包及解析
git https://github.com/sea-boat/mysql-protocol 概况 mysql客户端可以用query包向服务端发送一个基于文本查询. mysql通信报文结构 类型 名字 ...
- netty实现mysql协议_基于Netty模拟解析Binlog
前言 最近一段时间一直再看mysql binlog相关的内容,也整理了几篇相关的文章,对mysql的事件以及通讯协议在理论上有了一个大概的了解,但是缺少实战:本文的目的就是从实战出发,了解binlog ...
- MySQL协议解析及C/C++代码实现
MySQL 常用于许多知名网站,包括 Facebook.Google.Twitter 和 YouTube等等.它于 1995 年首次发布.MySQL 是用 C 和 C++ 编写的. MySQL 适用于 ...
- tshark 解析pcap中带TLS协议的数据包
tshark的简单用法参考:tshark解析本地pcap数据包提取五元组{src_ip,src_port,proto,dst_ip,dst_port}与时间戳,包长 详细用法:官方DOC 比如提取一个 ...
- java实现FTP协议:wireshark抓包解析
本节我们看看ftp协议的数据包格式,同时使用代码加以实现.首先我们现在机器上安装ftp服务器,我在自己的机器上安装了QuickFTP Server,它是我随便找来的一款Mac ftp服务器,如下图所示 ...
- 怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!
写在前面 最近,在开发一个分库分表中间件,由于功能需求,需要分析MySQL协议,发现网上对于MySQL协议分析的文章大部分都过时了,原因是分析的MySQL版本太低了.怎么办呢?于是乎,我便硬着头皮开始 ...
- mysql long类型_怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!...
点击上方蓝色"冰河技术",关注并选择"设为星标" 持之以恒,贵在坚持,每天进步一点点! 作者个人研发的在高并发场景下,提供的简单.稳定.可扩展的延迟消息队列框架 ...
最新文章
- C语言数字图像处理编程
- c语言int t格式,如何在C中打印int64_t类型
- const与#define相比,区别和优点超详解总结
- CoSENT:比Sentence-BERT更有效的句向量方案
- 可以通过执行报表RSVMCRT_MINI_DEBUGGER 查看CRM IPC中定价计算公式的相关源代码
- DxO FilmPack 5教程:对照片进行艺术渲染,使其具有专业电影的色彩和颗粒感
- 《objective-c基础教程》学习笔记(四)—— OC面向对象编程初探
- 6-6-阶段案例:传智书城JSP页面
- layui的table常用方法
- b-tree的索引页总览
- c语言助手,C语言代码实例助手
- 关于第三方支付,看这篇文章就够了!
- 单片机Fault故障常见应对办法
- 基于药效团模型和分子动力学模拟对PTP-LAR抑制剂的研究
- 刷B站学数分Day1|如何写出一份合格的数据分析师简历
- 微信表情符号写入判决书,你发的OK、炸弹都可能成为“呈堂证供”
- MAC地址和IP地址
- 机载LIDAR技术及其应用
- 树莓派(ubuntu系统)连接后使用HDMI-VGA,VGA无信号
- 比较两给json是否一致