Detaillierte Erläuterung des Mysql-Kommunikationsprotokolls

Detaillierte Erläuterung des Mysql-Kommunikationsprotokolls

1.Mysql-Verbindungsmethode

Um das MySQL-Kommunikationsprotokoll zu verstehen, müssen Sie zunächst wissen, welche Verbindungsmethode für die Verbindung mit dem MySQL-Server verwendet wird. Zu den wichtigsten Verbindungsmethoden von MySQL zählen: Unix-Sockets, gemeinsame Speichernutzung, Named Pipes, TCP/IP-Sockets usw.

1.1Unix-Sockets

In Linux- und Unix-Umgebungen können Sie Unix-Sockets verwenden, um eine Verbindung zum MySQL-Server herzustellen. Unix-Sockets sind eigentlich kein Netzwerkprotokoll und können nur verwendet werden, wenn sich Client und MySQL-Server auf demselben Computer befinden. Die Verwendung ist auch sehr einfach:

root@root ~]# mysql -uroot -proot
mysql> Variablen wie „Socket“ anzeigen;
+------------------+------------------------------+
| Variablenname | Wert |
+------------------+------------------------------+
| Socket | /var/lib/mysql/mysql.sock |
+------------------+------------------------------+
1 Zeile im Satz (0,00 Sek.)

Der obige Befehl fragt den Speicherort der Unix-Socket-Datei ab.

1.2 Named Pipes und gemeinsame Nutzung von Speicher

Im Fenstersystem befinden sich der Client und der MySQL-Server auf demselben Computer und es können Named Pipes und Shared Memory verwendet werden.

Named Pipe aktiviert: –shared-memory=on/off;

Gemeinsam genutzter Speicher aktiviert: –enable-named-pipe=on/off;

1.3 TCP/IP-Sockets

Diese Methode kann in jedem System verwendet werden und ist auch die am häufigsten verwendete Verbindungsmethode. Das in diesem Artikel vorgestellte Kommunikationsprotokoll basiert ebenfalls auf dieser Verbindungsmethode. Im Folgenden finden Sie ein vorläufiges Verständnis von TCP/IP-Sockets über tcpdump:

Serverseitig:

[root@root ~]# tcpdump-Port 3306
tcpdump: ausführliche Ausgabe unterdrückt, verwenden Sie -v oder -vv für die vollständige Protokolldekodierung
lauscht auf venet0, Link-Typ LINUX_SLL (Linux-gekocht), Erfassungsgröße 65535 Bytes

Der Server lauscht auf Port 3306 (das ist der MySQL-Port);

Kunde:

C:\Benutzer\hui.zhao>mysql -h64.xxx.xxx.xxx -uroot -proot
mysql> beenden
Tschüss

Der Client stellt eine Verbindung zum Server her und trennt sie dann. Beachten Sie zu diesem Zeitpunkt das Überwachungsergebnisprotokoll des Servers:

[root@root ~]# tcpdump-Port 3306
tcpdump: ausführliche Ausgabe unterdrückt, verwenden Sie -v oder -vv für die vollständige Protokolldekodierung
lauscht auf venet0, Link-Typ LINUX_SLL (Linux-gekocht), Erfassungsgröße 65535 Bytes
02:06:25.442472 IP 153.3.251.202.33876 > root.mysql: Flags [S], Sequenz 27289263, Win 8192, Optionen [mss 1460,nop,wscale 8,nop,nop,sackOK], Länge 0
02:06:25.442763 IP root.mysql > 153.3.251.202.33876: Flags [S.], seq 2014324548, ack 27289264, win 14600, Optionen [mss 1460,nop,nop,sackOK,nop,wscale 7], Länge 0
02:06:25.617449 IP 153.3.251.202.33876 > root.mysql: Flags [.], ack 1, win 256, Länge 0
02:06:29.812946 IP root.mysql > 153.3.251.202.33876: Flags [P.], Sequenz 1:57, Ack 1, Win 115, Länge 56
02:06:29.992362 IP 153.3.251.202.33876 > root.mysql: Flags [P.], Sequenz 1:63, Ack 57, Win 256, Länge 62
02:06:29.992411 IP root.mysql > 153.3.251.202.33876: Flags [.], ack 63, win 115, Länge 0
02:06:29.992474 IP root.mysql > 153.3.251.202.33876: Flags [P.], Sequenz 57:68, Ack 63, Win 115, Länge 11
02:06:30.166992 IP 153.3.251.202.33876 > root.mysql: Flags [P.], Sequenz 63:100, Ack 68, Win 256, Länge 37
02:06:30.167109 IP root.mysql > 153.3.251.202.33876: Flags [P.], Sequenz 68:158, Ack 100, Win 115, Länge 90
02:06:30.536298 IP 153.3.251.202.33876 > root.mysql: Flags [.], ack 158, win 256, Länge 0
02:06:34.568611 IP 153.3.251.202.33876 > root.mysql: Flags [P.], Sequenz 100:105, Ack 158, Win 256, Länge 5
02:06:34.568620 IP 153.3.251.202.33876 > root.mysql: Flags [F.], seq 105, ack 158, win 256, Länge 0
02:06:34.568751 IP root.mysql > 153.3.251.202.33876: Flags [F.], seq 158, ack 106, win 115, Länge 0
02:06:34.743815 IP 153.3.251.202.33876 > root.mysql: Flags [.], ack 159, win 256, Länge 0

[S]:SYN initiiert eine Verbindung, [P]:PUSH überträgt Daten, [F]:FIN schließt die Verbindung, [.]: zeigt ein Bestätigungspaket an;

Der Vorgang lässt sich grob wie folgt darstellen: Eine TCP-Verbindung herstellen, der Client und der Mysql-Server stellen eine Verbindungskommunikation her und schließen die TCP-Verbindung.

[S][S.][.] Diese Pakete stellen den Drei-Wege-Handshake der TCP-Verbindung dar;

[F.][F.][.] Diese Pakete repräsentieren vier Handshakes einer TCP-Verbindung;

Bei den mehreren [P.][.] in der Mitte handelt es sich eigentlich um die Protokolldatenpakete, die vom Client und vom MySQL-Server gesendet werden, um eine Verbindung herzustellen.

2. Protokollanalyse

Das MySQL-Protokoll wird verwendet, wenn MySQL-Clients und MySQL-Server kommunizieren. Es gibt mehrere spezifische Szenarien: Client- und Serververbindung, MySQL-Proxy und Master-Slave-Backup;

Die Interaktion zwischen dem MySQL-Client und dem Server ist hauptsächlich in zwei Phasen unterteilt: Verbindungsphase (oder Authentifizierungsphase) und Befehlsphase.

In Kombination mit der Ausgabe von tcpdump sieht der gesamte Kommunikationsprozess zwischen Client und Server wie folgt aus:

1. Richten Sie einen Drei-Wege-Handshake für eine TCP-Verbindung ein.
2. Stellen Sie eine Verbindung mit dem MySQL-Server her. Dies ist die Verbindungsphase (Verbindungsphase oder Authentifizierungsphase).
 s->c: Senden Sie ein erstes Handshake-Paket
 c->s: Authentifizierungsantwort senden
 s->c: Der Server sendet das Authentifizierungsergebnispaket 3. Nachdem die Authentifizierung bestanden wurde, akzeptiert der Server das Befehlspaket vom Client und sendet das entsprechende Antwortpaket, das die Befehlsphase darstellt.
4. Trennen Sie die Verbindung und fordern Sie den Exit-Befehl an.
5. Winken Sie TCP viermal, um die Verbindung zu trennen.

2.1 Grundtypen

Grundlegende Typen im gesamten Protokoll: Integer und String;

2.1.1 Integer-Typ

Es gibt zwei Typen: Integer-Typen mit fester Länge und längencodierte Integer-Typen.

Integer-Typen mit fester Länge:

Eine vorzeichenlose Ganzzahl fester Länge speichert ihren Wert in einer Reihe von Bytes. Die spezifische feste Anzahl von Bytes kann sein: 1, 2, 3, 4, 6, 8;

Längencodierter Integer-Typ:

Die Anzahl der für die Speicherung erforderlichen Bytes hängt von der Größe des Werts ab, wie unten gezeigt:

1 Byte: 0<=X<251;

2 Bytes: 251<=X<2^16;

3 Bytes: 2^16<=X<2^24;

9 Bytes: 2^24<=X<2^64;

2.1.2 String-Typ

Es gibt 5 Typen, darunter FixedLengthString, NullTerminatedString, VariableLengthString, LengthEncodedString und RestOfPacketString;

FixedLengthString: Ein String mit fester Länge hat eine bekannte fest codierte Länge, ein Beispiel ist der SQL-Status von ERR_Packet, der immer 5 Byte lang ist.
NullTerminatedString: Eine Zeichenfolge, die mit Null endet (Byte 00);

VariableLengthString: eine variable Zeichenfolge, deren Länge durch ein anderes Feld bestimmt oder zur Laufzeit berechnet wird, z. B. int+value, wobei int die Länge und value die Anzahl der Bytes der angegebenen Länge ist;

LengthEncodedString: Ein String mit dem Präfix einer längencodierten Ganzzahl, die die Länge des Strings beschreibt, im durch VariableLengthString angegebenen Format int+value;

RestOfPacketString: Wenn ein String die letzte Komponente eines Pakets ist, kann seine Länge berechnet werden, indem die aktuelle Position von der gesamten Paketlänge abgezogen wird.

2.2 Basisdatenpaket

Wenn ein MySQL-Client oder -Server Daten senden möchte, geschieht Folgendes:

Die Größe jedes Datenpakets darf 2^24 Bytes (16 MB) nicht überschreiten.

Fügen Sie vor jedem Datenblock einen Datenpaket-Header hinzu;

Das Paketformat ist wie folgt:

int<3>: Länge des spezifischen Paketinhalts; ausschließlich int<3>+int<1>=4 Bytes;
int<1>: sequence_id erhöht sich mit jedem Paket und kann umbrochen werden. Es beginnt bei 0 und wird auf 0 zurückgesetzt, wenn in der Befehlsphase ein neuer Befehl gestartet wird.
string<var>: spezifischer Dateninhalt, außerdem die durch int<3> angegebene Länge;

Zum Beispiel:

01 00 00 entspricht int, was darauf hinweist, dass die Länge des spezifischen Dateninhalts 1 Byte beträgt.

00 entspricht int, das die Sequenz-ID darstellt;

01 entspricht 1 Datenbyte, das vor der Zeichenfolge angegeben ist.

2.3 Nachrichtentyp

Es kann in drei Kategorien unterteilt werden: Anmeldeauthentifizierungsnachricht, Clientanforderungsnachricht und Serverrückmeldung, basierend auf mysql5.1.73 (mysql4.1 und spätere Versionen).

2.3.1 Login-Authentifizierungsnachricht

Hauptsächlich in der interaktiven Authentifizierungsphase, wie wir oben sehen können, ist sie in drei Phasen unterteilt: Handshake-Paket, Authentifizierungsantwort und Ergebnispaket. Hier analysieren wir hauptsächlich die ersten beiden Pakete;

2.3.1.1 Handshake-Paket

1 Byte: Protokollversionsnummer NullTerminatedString: Datenbankversionsinformationen 4 Bytes: Thread-ID, die durch Verbindung mit MySQL-Server gestartet wurde
8 Bytes: Challenge-Zufallszahl, wird für die Datenbankauthentifizierung verwendet. 1 Byte: Füllwert (0x00)
2 Bytes: werden verwendet, um den Kommunikationsmodus mit dem Client auszuhandeln. 1 Byte: Datenbankcode 2 Bytes: Serverstatus 13 Bytes: reservierte Bytes 12 Bytes: Challenge-Zufallszahl, wird für die Datenbankauthentifizierung verwendet. 1 Byte: Füllwert (0x00)

Verwenden Sie tcpdump, um das hexadezimale Protokoll wie folgt zu überwachen und auszugeben:

[root@root ~]# tcpdump port 3306 -X
......
03:20:34.299521 IP root.mysql > 153.3.251.202.44658: Flags [P.], Sequenz 1:57, Ack 1, Win 115, Länge 56
 0x0000: 4508 0060 09f1 4000 4006 c666 43da 9190 E..`..@[email protected]...
 0x0010: 9903 fbca 0cea ae72 bb4e 25ba 21e7 27e3 .......rN%.!.'.
 0x0020: 5018 0073 b1e0 0000 3400 0000 0a35 2e31 P..s....4....5.1
 0x0030: 2e37 3300 4024 0000 5157 4222 252f 5f6f .73.@$..QWB"%/_o
 0x0040: 00ff f708 0200 0000 0000 0000 0000 0000 ................
 0x0050: 0000 0032 4a5d 7553 7e45 784f 627e 7400 ...2J]uS~ExOb~t.

Die Gesamtlänge des Pakets beträgt 56, minus int<3>+int<1>4 Bytes = 52 Bytes, der entsprechende Hexadezimalwert ist 34; int<3> Hexadezimal ist 3400 00 stellt die Paketinhaltslänge dar, int<1> Hexadezimal ist 00 stellt die Sequenz-ID dar; der nachfolgende Inhalt ist der Paketkörperinhalt, insgesamt 52 Bytes, 0a entspricht Dezimalzahl 10, alle Protokollversionsnummern sind 10; die nachfolgenden Datenbankversionsinformationen enden mit 00, 35 2e31 2e37 33 entspricht 5.1.73, der aktuell verwendeten Datenbankversion; 4024 0000 entspricht Dezimalzahl 6436; 08 stellt den Datenbankcode dar; 0200 stellt den Serverstatus dar; die nachfolgenden 13 Paare von 00 sind reservierte Bytes; die letzten 13 Bytes sind die Challenge-Zufallszahl und der Füllwert.

2.3.1.2 Authentifizierungspaket

4 Bytes: werden verwendet, um den Kommunikationsmodus mit dem Client auszuhandeln. 4 Bytes: die maximale Nachrichtenlänge, die vom Client beim Senden einer Anforderungsnachricht unterstützt wird. 1 Byte: identifiziert die im Kommunikationsprozess verwendete Zeichenkodierung. 23 Bytes: reservierte Bytes NullTerminatedString: Benutzername LengthEncodedString: verschlüsseltes Passwort NullTerminatedString: Datenbankname (optional)

Verwenden Sie tcpdump, um das hexadezimale Protokoll wie folgt zu überwachen und auszugeben:

03:20:34.587416 IP 153.3.251.202.44658 > root.mysql: Flags [P.], Sequenz 1:63, Ack 57, Win 256, Länge 62
 0x0000: 4500 0066 29ee 4000 7006 766b 9903 fbca E..f)[email protected]....
 0x0010: 43da 9190 ae72 0cea 21e7 27e3 bb4e 25f2 C....r..!.'..N%.
 0x0020: 5018 0100 d8d2 0000 3a00 0001 85a6 0f00 P.......:.......
 0x0030: 0000 0001 2100 0000 0000 0000 0000 0000 ....!...........
 0x0040: 0000 0000 0000 0000 0000 0000 726f 6f74 ............ Wurzel
 0x0050: 0014 ff58 4bd2 7946 91a0 a233 f2c1 28af ...XK.yF...3..(.
 0x0060: d578 0762 c2e8 .xb.

Die Gesamtlänge des Pakets beträgt 62, minus int<3>+int<1>4 Bytes = 58 Bytes, das entsprechende Hexadezimal ist 3a; int<3> Hexadezimal ist 3a00 00 stellt die Paketinhaltslänge dar; int<1> Hexadezimal ist 01 stellt die Sequenz-ID dar; 726f 6f74 00 ist der Benutzername, der nach der Dekodierung root ist; das Folgende ist der verschlüsselte Passworttyp

LengthEncodedString, der Dezimalwert von 14 ist 20 und die folgenden 20 Bytes sind das verschlüsselte Passwort; der optionale Datenbankname existiert nicht.

2.4 Client-Anforderungsnachricht

int<1>: der auszuführende Befehl, z. B. zum Wechseln von Datenbanken string<var>: die entsprechenden Parameter des Befehls

Befehlsliste:

0x00 COM_SLEEP (interner Thread-Status)
0x01 COM_QUIT Verbindung schließen 0x02 COM_INIT_DB Datenbank wechseln 0x03 COM_QUERY SQL-Abfrageanforderung 0x04 COM_FIELD_LIST Datentabellenfeldinformationen abrufen 0x05 COM_CREATE_DB Datenbank erstellen 0x06 COM_DROP_DB Datenbank löschen 0x07 COM_REFRESH Cache leeren 0x08 COM_SHUTDOWN Server stoppen 0x09 COM_STATISTICS Serverstatistiken abrufen 0x0A COM_PROCESS_INFO Liste der aktuellen Verbindungen abrufen 0x0B COM_CONNECT (interner Threadstatus)
0x0C COM_PROCESS_KILL Verbindung beenden 0x0D COM_DEBUG Server-Debugging-Informationen speichern 0x0E COM_PING Konnektivität testen 0x0F COM_TIME (interner Thread-Status)
0x10 COM_DELAYED_INSERT (interner Thread-Status)
0x11 COM_CHANGE_USER Erneut anmelden (Dauerverbindung)
0x12 COM_BINLOG_DUMP Binärprotokollinformationen abrufen 0x13 COM_TABLE_DUMP Datentabellenstrukturinformationen abrufen 0x14 COM_CONNECT_OUT (interner Threadstatus)
0x15 COM_REGISTER_SLAVE Den Slave-Server beim Master-Server registrieren 0x16 COM_STMT_PREPARE SQL-Anweisungen vorbereiten 0x17 COM_STMT_EXECUTE Vorbereitete Anweisungen ausführen 0x18 COM_STMT_SEND_LONG_DATA BLOB-Daten senden 0x19 COM_STMT_CLOSE Vorbereitete Anweisungen vernichten 0x1A COM_STMT_RESET Den Parametercache für vorbereitete Anweisungen löschen 0x1B COM_SET_OPTION Anweisungsoptionen festlegen 0x1C COM_STMT_FETCH Das Ausführungsergebnis vorbereiteter Anweisungen abrufen

Beispiel: Verwenden Sie „test“, „tcpdump“ zur Überwachung und die hexadezimale Protokollausgabe lautet wie folgt:

22:04:29.379165 IP 153.3.251.202.33826 > root.mysql: Flags [P.], Sequenz 122:131, Ack 222, Win 64019, Länge 9
 0x0000: 4500 0031 3f19 4000 7006 6175 9903 fbca [email protected]....
 0x0010: 43da 9190 8422 0cea 42e2 524b 7e18 25c1 C...."....B.RK~.%.
 0x0020: 5018 fa13 a07b 0000 0500 0000 0274 6573 P....{.......tes
 0x0030: 74

Die Gesamtlänge des Pakets beträgt 9, minus int<3>+int<1>4 Bytes = 5 Bytes, der entsprechende Hexadezimalwert ist 05; int<3> hexadezimal ist 0500 00 stellt die Länge des Paketinhalts dar; int<1> hexadezimal ist 00 stellt die Sequenz-ID dar; 02 entspricht COM_INIT_DB, gefolgt vom Binärcode des Tests;

2.5 Server-Antwortnachricht

Für die meisten vom Client an den Server gesendeten Befehle gibt der Server eines der Antwortpakete zurück: OK_Packet, ERR_Packet und EOF_Packet, Result Set;

2.5.1OK_Paket

Zeigt an, dass ein Befehl erfolgreich abgeschlossen wurde. Das spezifische Format ist wie folgt:

int<1>: 0x00 oder 0xFEOK-Header int<lenenc>: Anzahl der betroffenen Zeilen int<lenenc>: zuletzt eingefügte Index-ID
int<2>: Serverstatus int<2>: Alarmanzahl Hinweis: nur in MySQL 4.1 und späteren Versionen verfügbar string<lenenc>: Servernachricht (optional)

use test; Der Server gibt ein Paket zurück und überwacht es mit tcpdump. Die hexadezimale Protokollausgabe lautet wie folgt:

22:04:29.379308 IP root.mysql > 153.3.251.202.33826: Flags [P.], seq 222:233, ack 131, win 14600, Länge 11
 0x0000: 4508 0033 4a0a 4000 4006 867a 43da 9190 E..3J.@[email protected]...
 0x0010: 9903 fbca 0cea 8422 7e18 25c1 42e2 5254 ......."~.%.B.RT
 0x0020: 5018 3908 3b61 0000 0700 0001 0000 0002 P.9.;a..........
 0x0030: 0000 00

Die Gesamtlänge des Pakets beträgt 11, minus int<3>+int<1>4 Bytes = 7 Bytes, der entsprechende Hexadezimalwert ist 07; int<3> ist hexadezimal 0700. 00 gibt die Länge des Paketinhalts an; int<1> ist hexadezimal 01 und gibt die Sequenz-ID an; 00 gibt den Paketheader an; 00 gibt die Anzahl der betroffenen Zeilen an; 00 gibt die zuletzt eingefügte Index-ID an; 0200 gibt den Serverstatus an;

2.5.2ERR_Paket

Zeigt an, dass ein Fehler aufgetreten ist. Das spezifische Format ist wie folgt:

int<1>: 0xFF ERR-Header int<2>: Fehlercode string[1]: SQL-Statuskennung Hinweis: Nur in MySQL 4.1 und späteren Versionen verfügbar string[5]: SQL-Status Hinweis: Nur in MySQL 4.1 und späteren Versionen verfügbar string<EOF>: Fehlermeldung

2.5.3EOF_Paket

So markieren Sie das Ende der Abfrageausführungsergebnisse:

int<1>: EOF-Wert (0xFE)
int<2>: Alarmanzahl Hinweis: Nur in MySQL 4.1 und späteren Versionen verfügbar int<2>: Statusflag Hinweis: Nur in MySQL 4.1 und späteren Versionen verfügbar

2.5.4Ergebnismenge

Wenn der Client eine Abfrageanforderung sendet und kein Fehler vorliegt, gibt der Server einen Ergebnissatz an den Client zurück. Insgesamt gibt es fünf Teile:

Ergebnissatzüberschrift Die Anzahl der Spalten der zurückgegebenen Daten. Feld Die Spalteninformationen der zurückgegebenen Daten (mehrere)
EOF Spaltenende Zeilendaten Zeilendaten (mehrere)
EOF Ende der Daten

2.5.4.1Ergebnissatz-Header

Längencodierte Ganzzahl Anzahl der Feldstrukturen Längencodierte Ganzzahl Zusatzinformationen

2.5.4.2Feld

LengthEncodedString VerzeichnisnameLengthEncodedString DatenbanknameLengthEncodedString TabellennameLengthEncodedString Ursprünglicher TabellennameLengthEncodedString Spaltenname (Feld)LengthEncodedString Ursprünglicher Spaltenname (Feld)int<1> Füllwertint<2> Zeichenkodierungint<4> Spaltenlänge (Feld)int<1> Spaltentyp (Feld)int<2> Spaltenflag (Feld)int<1> Integerwert Genauigkeitint<2> Füllwert (0x00)
LengthEncodedString Standardwert

2.5.4.3EOF

Siehe 2.5.3EOF_Packet

2.5.4.4Zeilendaten

LengthEncodedString-Feldwert... mehrere Feldwerte

Beispielanalyse, die Tabelleninformationen lauten wie folgt:

CREATE TABLE `btest` (
 `id` bigint(20) NICHT NULL AUTO_INCREMENT,
 `Alter` int(11) DEFAULT NULL,
 `name` varchar(255) DEFAULT NULL,
 PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8

select * from btest; Die vom Server zurückgegebenen Daten sind wie folgt:

mysql> wähle * aus btest;
+----+------+---------+
| ID | Alter | Name |
+----+------+---------+
| 1 | 10 | zhaohui |
| 2 | 11 | zhaohui |
+----+------+---------+

Die vom Server zurückgegebenen Pakete werden mit tcpdump überwacht und die hexadezimale Protokollausgabe lautet wie folgt:

01:54:21.522660 IP root.mysql > 153.3.251.202.58587: Flags [P.], Sequenz 1:196, Ack 24, Win 115, Länge 195
 0x0000: 4508 00eb 8839 4000 4006 4793 43da 9190 E....9@[email protected]..
 0x0010: 9903 fbca 0cea e4db 9dd8 0216 eda6 f730 ...............0
 0x0020: 5018 0073 ca34 0000 0100 0001 0328 0000 P..s.4.......(..
 0x0030: 0203 6465 6604 7465 7374 0562 7465 7374 ..def.test.btest
 0x0040: 0562 7465 7374 0269 6402 6964 0c3f 0014 .btest.id.id.?..
 0x0050: 0000 0008 0342 0000 002a 0000 0303 6465 .....B...*....de
 0x0060: 6604 7465 7374 0562 7465 7374 0562 7465 f.test.btest.bte
 0x0070: 7374 0361 6765 0361 6765 0c3f 000b 0000 Stufe.Alter.Alter.?...
 0x0080: 0003 0000 0000 002c 0000 0403 6465 6604 .......,....def.
 0x0090: 7465 7374 0562 7465 7374 0562 7465 7374 test.btest.btest
 0x00a0: 046e 616d 6504 6e61 6d65 0c21 00fd 0200 .name.name.!....
 0x00b0: 00fd 0000 0000 0005 0000 05fe 0000 2200 ..............".
 0x00c0: 0d00 0006 0131 0231 3007 7a68 616f 6875 .....1.10.zhaohu
 0x00d0: 690d 0000 0701 3202 3131 077a 6861 6f68 ich.....2.11.zhaoh
 0x00e0: 7569 0500 0008 fe00 0022 00 ui......."

0328 0000 02 entspricht dem Ergebnissatzheader, 03 gibt 3 Felder an; 03 6465 66 entspricht dem Standardwert def des Verzeichnisnamens, 03 gibt an, dass die Anzahl der folgenden Bytes 3 ist; 04 7465 7374

Der entsprechende Wert ist der Datenbankname Test; 0562 7465 7374 entspricht dem Datentabellennamen btest; 0562 7465 7374 entspricht dem ursprünglichen Namen der Datentabelle btest; 0269 64 entspricht dem Feldnamen ID; 02 6964 entspricht dem ursprünglichen Namen der Spalte (des Felds) ID; 0c3f 00 entspricht dem Füllwert und der Zeichenkodierung; 14 0000 00 entspricht 20 in Dezimalzahlen und gibt die Länge der Spalte (des Felds) an; 08 0342 00 gibt jeweils den Spaltentyp (Feld), die Kennung und die Genauigkeit des ganzzahligen Werts an; 00002 Bytes sind der Füllwert; 00 ist der Standardwert, der leer anzeigt;

Die nachfolgenden Alters- und Namensfelder sind dieselben wie oben und werden nicht wiederholt;

Das Zeichen 1, das dem Typ LengthEncodedString 0131 entspricht, ist der Wert der ID; das Zeichen 10, das dem Typ LengthEncodedString 0231 30 entspricht, ist der Wert des Alters; das Zeichen zhaohui, das dem Typ LengthEncodedString 07 7a68 616f 6875 69 entspricht, ist der Wert des Namens;

Oben finden Sie alle Inhalte zum MySQL-Kommunikationsprotokoll, die wir für Sie zusammengestellt haben. Wenn Sie beim Lernen Fragen haben, können Sie uns eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

<<:  So bringen Sie Ihren Browser dazu, mit JavaScript zu sprechen

>>:  Installieren Sie Python 3.6 unter Linux und vermeiden Sie Fallstricke

Artikel empfehlen

jQuery erzielt den Shutter-Effekt (mithilfe der Li-Positionierung)

In diesem Artikel wird der spezifische Code von j...

Beispielcode von Vue + Element UI zur Realisierung der Player-Funktion

Die Anzeige ohne Effektbild ist nur leeres Gerede...

Automatisiertes Frontend-Deployment basierend auf Docker, Nginx und Jenkins

Inhaltsverzeichnis Vorbereitende Vorbereitung Ber...

Tutorials der MySQL-Reihe für Anfänger

Inhaltsverzeichnis 1. Grundkonzepte und Grundbefe...

Detaillierte Erklärung des Inline-Formats von HTML-Tabellen

Inline-Format <colgroup>…</colgroup> ...

Implementierung der CSS3-Button-Randanimation

Erster Blick auf die Wirkung: html <a href=&qu...

Lernprogramm zur Verwendung des WeChat-Applets WXS

Was ist wxs? wxs (WeiXin Script) ist eine Skripts...

Detailliertes Tutorial zur Installation und Konfiguration von Nginx unter Centos7

Hinweis: Der grundlegende Verzeichnispfad für die...

Detaillierte Erläuterung der Konzepte und Verwendung von Docker Swarm

Docker Swarm ist ein von Docker entwickelter Cont...