mysql 協議的幾種包及解析

? ?mysql通信報文結構

類型 名字 描述
int payload長度 按照the least significant byte first存儲,3個字節的payload和1個字節的序列號組合成報文頭
int 序列號
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?<p style="margin: 0.8em 0px; padding: 0px; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: " microsoft yahei line-height: white-space: normal widows: background-color: rgb>ColumnDefinition包</p> <p>Payload</p> <pre class="brush:php;toolbar:false">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()?&amp;?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?&amp;?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";  ????}    }

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享