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";
    }
}
   
 
   