Maison >base de données >tutoriel mysql >Package ColumnDefinition et analyse des détails du code du protocole MySQL

Package ColumnDefinition et analyse des détails du code du protocole MySQL

黄舟
黄舟original
2017-03-07 13:24:271382parcourir


git

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

Présentation

Le package ColumnDefinition fait partie du package lorsque le serveur renvoie le ResultSet et est utilisé pour décrire les informations de champ de l'ensemble de résultats.

Structure du message de communication MySQL

Type Nom Description th >
int5bdf4c78156c7953567bb5a0aef2fc53 la longueur de la charge utile est stockée en fonction de l'octet de poids faible en premier, 3 mots La charge utile de la strophe et le numéro de séquence de 1 octet sont combinés dans un en-tête de message
intf35d6e602fd7d0f0edfa6f7d103c1b57 Numéro de série
类型 名字 描述
int5bdf4c78156c7953567bb5a0aef2fc53 payload长度 按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头
intf35d6e602fd7d0f0edfa6f7d103c1b57 序列号
string payload 报文体,长度即为前面指定的payload长度
chaîne charge utile Corps du message, la longueur est la longueur de la charge utile précédemment spécifiée tr>

ColumnDefinition Package

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 set4              
column length1              
type2              
flags1              
decimals2              
filler [00] [00]  if command was COM_FIELD_LIST {
lenenc_int     
length of default-valuesstring[$len]   
default values
  }

Plus de détails : http : / /dev.mysql.com/doc/internals/en/com-query-response.html#column-definition

Classe de package ColumnCount

/**
 * 
 * <pre class="brush:php;toolbar:false"><b>column definition command packet.</b>
* @author *
seaboat
*
<b>email: </b>849586227@qq.com
*
<b>blog: </b>http://www.php.cn/;/pre>
 * @version 1.0
 * @see http://www.php.cn/
 */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";
    }

}

Ce qui précède est le package ColumnDefinition de le protocole mysql et pour plus de détails sur l'analyse du code, veuillez faire attention au site Web chinois PHP (www.php.cn) pour plus de contenu connexe !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn