最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

mysql协议的几种包及解析

来源:懂视网 责编:小采 时间:2020-11-09 09:12:25
文档

mysql协议的几种包及解析

mysql协议的几种包及解析:mysql通信报文结构类型名字描述int<3>payload长度按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头int<1>序列号stringpayload报文体,长度即为前面指定的payload长度Resultse
推荐度:
导读mysql协议的几种包及解析:mysql通信报文结构类型名字描述int<3>payload长度按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头int<1>序列号stringpayload报文体,长度即为前面指定的payload长度Resultse

mysql通信报文结构

类型名字描述
int<3>payload长度按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头
int<1>序列号
stringpayload报文体,长度即为前面指定的payload长度

ResultsetRow包

Payload

if(NULL){ 
0xfb
}else{
 Protocol::LengthEncodedString
}

ResultsetRow包类

public class ResultsetRowPacket extends MySQLPacket {
 private static final byte NULL_MARK = (byte) 251;
 public int columnCount;
 public List<byte[]> 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";
 }

}

ColumnDefinition包

Payload

lenenc_str catalog
lenenc_str schema
lenenc_str table
lenenc_str org_table
lenenc_str name
lenenc_str org_name
lenenc_int length of fixed-length fields [0c]
2 character set
4 column length
1 type
2 flags
1 decimals
2 filler [00] [00]
 if command was COM_FIELD_LIST {
lenenc_int length of default-values
string[$len] default values
 }

ColumnCount包类

public class ColumnDefinitionPacket extends MySQLPacket {
 private static final byte[] DEFAULT_CATALOG = "def".getBytes();
 private static final byte NEXT_LENGTH = 0x0c;
 private static final byte[] FILLER = { 00, 00 };

 public byte[] catalog = DEFAULT_CATALOG;// always "def"
 public byte[] schema;
 public byte[] table;
 public byte[] orgTable;
 public byte[] name;
 public byte[] orgName;
 public byte nextLength = NEXT_LENGTH;// always 0x0c
 public int charsetSet;
 public long length;
 public int type;
 public int flags;
 public byte decimals;
 public byte[] filler = FILLER;
 public byte[] defaultValues;

 public void read(byte[] data) {
 MySQLMessage mm = new MySQLMessage(data);
 this.packetLength = mm.readUB3();
 this.packetId = mm.read();
 this.catalog = mm.readBytesWithLength();
 this.schema = mm.readBytesWithLength();
 this.table = mm.readBytesWithLength();
 this.orgTable = mm.readBytesWithLength();
 this.name = mm.readBytesWithLength();
 this.orgName = mm.readBytesWithLength();
 this.nextLength = mm.read();
 this.charsetSet = mm.readUB2();
 this.length = mm.readUB4();
 this.type = mm.read() & 0xff;
 this.flags = mm.readUB2();
 this.decimals = mm.read();
 this.filler = mm.readBytes(2);
 if (mm.hasRemaining()) {
 this.defaultValues = mm.readBytesWithLength();
 }
 }

 @Override
 public void write(ByteBuffer buffer) {
 int size = calcPacketSize();
 BufferUtil.writeUB3(buffer, size);
 buffer.put(packetId);
 BufferUtil.writeWithLength(buffer, catalog, (byte) 0);
 BufferUtil.writeWithLength(buffer, schema, (byte) 0);
 BufferUtil.writeWithLength(buffer, table, (byte) 0);
 BufferUtil.writeWithLength(buffer, orgTable, (byte) 0);
 BufferUtil.writeWithLength(buffer, name, (byte) 0);
 BufferUtil.writeWithLength(buffer, orgName, (byte) 0);
 buffer.put(NEXT_LENGTH);
 BufferUtil.writeUB2(buffer, charsetSet);
 BufferUtil.writeUB4(buffer, length);
 buffer.put((byte) (type & 0xff));
 BufferUtil.writeUB2(buffer, flags);
 buffer.put(decimals);
 buffer.put(FILLER);
 if (defaultValues != null) {
 //only use for show columns
 BufferUtil.writeWithLength(buffer, defaultValues);
 }
 }

 @Override
 public int calcPacketSize() {
 int size = (catalog == null ? 1 : BufferUtil.getLength(catalog));
 size += (schema == null ? 1 : BufferUtil.getLength(schema));
 size += (table == null ? 1 : BufferUtil.getLength(table));
 size += (orgTable == null ? 1 : BufferUtil.getLength(orgTable));
 size += (name == null ? 1 : BufferUtil.getLength(name));
 size += (orgName == null ? 1 : BufferUtil.getLength(orgName));
 size += 13;
 if (defaultValues != null) {
 size += BufferUtil.getLength(defaultValues);
 }
 return size;
 }

 @Override
 protected String getPacketInfo() {
 return "MySQL Column Definition Packet";
 }

}

ColumnCount包

Payload

Protocol::LengthEncodedInteger

ColumnCount包类

public class ColumnCountPacket extends MySQLPacket {

 public int columnCount;

 public void read(byte[] data) {
 MySQLMessage mm = new MySQLMessage(data);
 this.packetLength = mm.readUB3();
 this.packetId = mm.read();
 this.columnCount = (int) mm.readLength();
 }

 @Override
 public void write(ByteBuffer buffer) {
 int size = calcPacketSize();
 BufferUtil.writeUB3(buffer, size);
 buffer.put(packetId);
 BufferUtil.writeLength(buffer, columnCount);
 }

 @Override
 public int calcPacketSize() {
 int size = BufferUtil.getLength(columnCount);
 return size;
 }

 @Override
 protected String getPacketInfo() {
 return "MySQL Column Count Packet";
 }

}

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

mysql协议的几种包及解析

mysql协议的几种包及解析:mysql通信报文结构类型名字描述int<3>payload长度按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头int<1>序列号stringpayload报文体,长度即为前面指定的payload长度Resultse
推荐度:
标签: 协议 mysql 解析包
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top