mysql resultset_mysql 协议的ResultsetRow包及解析

本文介绍MySQL协议中ResultsetRow包的结构与解析方法,包括其在通信报文中的位置、字段含义及其对应的Java类实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git

https://github.com/sea-boat/mysql-protocol

概况

ResultsetRow包属于服务端返回ResultSet时的其中一部分包,用于描述结果集的行记录。

mysql通信报文结构类型名字描述int<3>payload长度按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头

int<1>序列号

stringpayload报文体,长度即为前面指定的payload长度

ResultsetRow包

Payloadif(NULL){ 0xfb}else{

Protocol::LengthEncodedString}

更多详情 : http://dev.mysql.com/doc/internals/en/com-query-response.html#text-resultset

ResultsetRow包类/**

*

*

resultset row packet.

* @author

*

seaboat

*

email: 849586227@qq.com

*

blog: http://www.php.cn/;/pre>

* @version 1.0

* @see http://www.php.cn/

*/public class ResultsetRowPacket extends MySQLPacket {

private static final byte NULL_MARK = (byte) 251;

public int columnCount;

public List columnValues;

public ResultsetRowPacket() {

}

public ResultsetRowPacket(int columnCount) {

this.columnCount = columnCount;

}

@Override

public void read(byte[] data) {

MySQLMessage mm = new MySQLMessage(data);

packetLength = mm.readUB3();

packetId = mm.read();

for (int i = 0; i < columnCount; i++) {

columnValues.add(mm.readBytesWithLength());

}

} @Override

public void write(ByteBuffer buffer) {

BufferUtil.writeUB3(buffer, calcPacketSize());

buffer.put(packetId);

for (int i = 0; i < columnCount; i++) {

byte[] fv = columnValues.get(i);

if (fv == null) {

buffer.put(NULL_MARK);

} else {

BufferUtil.writeLength(buffer, fv.length);

buffer.put(fv);

}

}

} @Override

public int calcPacketSize() {

int size = 0;

for (int i = 0; i < columnCount; i++) {

byte[] v = columnValues.get(i);

size += (v == null || v.length == 0) ? 1 : BufferUtil.getLength(v);

} return size;

} @Override

protected String getPacketInfo() {

return "MySQL Resultset Row Packet";

}

}

以上就是mysql 协议的ResultsetRow包及解析的内容,更多相关内容请关注PHP中文网(www.php.cn)!

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值