MySQL通信协议栈Java实现-(2)协议包格式

2. 协议包格式

MySQL client和MySQL server之间要想传输数据,必须:
1. 将数据切分成若干个大小不超过mathtex.cgi?%20%5Csmall%202%5E%7B24%7D-1字节(16MB)的packet里面
2. 将每一个数据包封装一个包头

2.1. 数据包结构

TypeNameDescription
int<3>payload_length负载数据长度,除了包头的前4字节剩余的长度
int<1>sequence_id序列号
string payload长度为payload_length的字符串

注意:
当传输大于16MB的数据包时,payload_length为mathtex.cgi?%20%5Csmall%202%5E%7B24%7D-1,并且还有其他的包包含剩余的数据,直到有一个包的数据量少于mathtex.cgi?%20%5Csmall%202%5E%7B24%7D-1为止。

序列号:序列号随着包增长并且可以循环利用。序列号从0开始,在MySQL command(MySQL命令)阶段时,每次有新的命令,就会有新的序列号。

2.2. 基本响应包

2.2.1. OK Packet

服务器用OK Packet来告诉客户端一条命令执行成功了。在MySQL5.7.5中,OK Packet用来标识EOF,EOF Packet废弃不用了。
结构:
1. header:int<1> ,包头:内容为[00]或者[fe]
2. affected_rows: int<lenec>, 命令影响的记录数
3. last_insert_id:int<lenec>,上一次插入的id
如果capabilities & CLIENT_PROTOCOL_41为真 {
4. status_flags:int<2>,状态位
5. warnings:int<2>,waring个数
}或者如果capabilities & CLIENT_TRANSACTIONS为真
4. status_flags:int<2>,状态位
}
如果capabilities & CLIENT_SESSION_TRACK为真{
6. info:string<lenec>,状态信息解释
如果status_flags & SERVER_SESSION_STATE_CHANGED 为真{
7. session_state_changes:string<lenec>,会话状态信息
}
} else {
6. info:string<EOF>,状态信息解释
}

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值