您好,欢迎访问一九零五行业门户网

mysql 协议的几种包及解析

mysql通信报文结构
类型名字描述
int5bdf4c78156c7953567bb5a0aef2fc53 payload长度 按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头
intf35d6e602fd7d0f0edfa6f7d103c1b57 序列号
string payload 报文体,长度即为前面指定的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"; } }
其它类似信息

推荐信息