Detaillierte Erklärung der binären und varbinären Datentypen in MySQL

Detaillierte Erklärung der binären und varbinären Datentypen in MySQL

Vorwort

BINARY und VARBINARY ähneln in gewisser Weise den Typen CHAR und VARCHAR, mit der Ausnahme, dass BINARY und VARBINARY Binärzeichenfolgen statt Zeichenfolgen speichern. Mit anderen Worten: BINARY und VARBINARY verfügen nicht über das Konzept von Zeichensätzen und ihre Sortierung und ihr Vergleich basieren alle auf Binärwerten.

Das N in BINARY(N) und VARBINARY(N) bezieht sich auf die Bytelänge, während sich das N in CHAR(N) und VARCHAR(N) auf die Zeichenlänge bezieht. Bei BINARY(10) ist die Anzahl der speicherbaren Bytes auf 10 festgelegt, während bei CHAR(10) die Anzahl der speicherbaren Bytes vom Zeichensatz abhängt.

Schauen wir uns das folgende Beispiel an.

mysql> CREATE TABLE t (
 -> eine BINARY(1)
 ->)ENGINE=InnoDB CHARSET=GBK;
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
mysql> NAMEN FESTLEGEN GBK;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
MySQL> INSERT INTO t SELECT 'i';
Abfrage OK, 1 Zeile betroffen, 1 Warnung (0,01 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 1
mysql> WARNUNGEN ANZEIGEN\G;
*************************** 1. Reihe ***************************
 Stufe: Warnung
 Code: 1265
Meldung: Daten für Spalte „a“ in Zeile 1 abgeschnitten
1 Zeile im Satz (0,00 Sek.)
mysql> WÄHLEN Sie a, HEX(a) VON t\G;
*************************** 1. Reihe ***************************
 A:
HEX(a): CE

Tabelle t enthält eine Spalte vom Typ BINARY(1) . Da N in BINARY(N) Bytes darstellt und das chinesische Zeichen "我" im gbk-Zeichensatz 2 Bytes benötigt, wird beim Einfügen eine Warnung ausgegeben, die darauf hinweist, dass das Zeichen abgeschnitten ist. Wenn SQL_MODE der strikte Modus ist, wird direkt ein Fehler gemeldet. Wenn wir den Inhalt der Tabelle t betrachten, können wir feststellen, dass nur das erste Byte des Zeichens „I“ in a gespeichert ist und das zweite Byte abgeschnitten ist. Wenn der Zeichentyp in Spalte a der Tabelle t CHAR ist, tritt das obige Problem überhaupt nicht auf, zum Beispiel:

mysql> CREATE TABLE t (
 -> ein CHAR(1)
 ->)ENGINE=InnoDB CHARSET=GBK;
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
mysql> INSERT INTO t SELECT 'I';
Abfrage OK, 1 Zeile betroffen, 1 Warnung (0,01 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
mysql> WÄHLEN Sie a, HEX(a) VON t\G;
*************************** 1. Reihe ***************************
 a: Ich HEX (a): CED2
1 Zeile im Satz (0,00 Sek.)

Der erste Unterschied zwischen BINARY und VARBINARY im Vergleich zu CHAR und VARCHAR besteht darin, dass der N-Wert in BINARY(N) und VARBINARY(N) die Anzahl der Bytes und nicht die Länge der Zeichen darstellt. Der zweite Unterschied besteht darin, dass CHAR und VARCHAR beim Vergleichen von Zeichen nur die in den Zeichen selbst gespeicherten Zeichen vergleichen und die Füllzeichen nach den Zeichen ignorieren. Bei BINARY und VARBINARY sind die Ergebnisse sehr unterschiedlich, da sie anhand von Binärwerten verglichen werden. Beispiel:

mysql> AUSWÄHLEN
 -> HEX('a'),
 -> HEX('a '),
 -> 'ein'='ein '\G; 
*************************** 1. Reihe ***************************
HEX('a'): 61
HEX('a '): 612020
'ein'='ein': 1
1 Zeile im Satz (0,00 Sek.)
mysql> AUSWÄHLEN
 -> HEX(BINÄR('a')),
 -> HEX(BINÄR('a ')),
 -> BINÄR('a') = BINÄR('a ')\G; 
*************************** 1. Reihe ***************************
  HEX(BINÄR('a')): 61
 HEX(BINÄR('a ')): 612020
BINÄR('a') = BINÄR('a '): 0
1 Zeile im Satz (0,00 Sek.)

Bei CHAR und VARCHAR werden Zeichenwerte verglichen, daher ist der Rückgabewert des ersten Vergleichs 1. Bei BINARY und VARBINARY erfolgt der Vergleich mit binären Werten. Der Hexadezimalwert von „a“ ist 61, und der Hexadezimalwert von „a“ ist 612020, was offensichtlich unterschiedlich ist. Daher ist der Rückgabewert des zweiten Vergleichs 0.

Der dritte Unterschied besteht darin, dass bei BINARY-Zeichenfolgen das Füllzeichen 0x00 ist, während das Füllzeichen für CHAR 0x20 ist. Dies kann an der BINARY-Vergleichsanforderung liegen. 0x00 ist offensichtlich das Mindestzeichen für den Vergleich. Das Beispiel lautet wie folgt:

mysql> CREATE TABLE t ( ein BINARY(3));
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> INSERT INTO t SELECT 'a';
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
mysql> WÄHLEN Sie a, HEX(a) VON t\G;
*************************** 1. Reihe ***************************
 ein: ein
HEX(a): 610000
1 Zeile im Satz (0,00 Sek.)

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels Ihnen bei Ihrem Studium oder Ihrer Arbeit helfen kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung der Datentypen und Schemaoptimierung in MySQL
  • Optimierungsmethoden im Zusammenhang mit Datentypen in MySQL
  • Beispiel für das Festlegen von Datentypen in MySQL zur Optimierung der Ausführungsgeschwindigkeit
  • MySQL-Optimierung: 5 Vorschläge zur Optimierung der Tabellenstruktur (Datentypauswahl wird gut erklärt)
  • Konvertieren Sie den von pymysql erhaltenen Datentyp von Tupel in Pandas
  • Detaillierte Erläuterung der grundlegenden Datentypen in mysql8.0.19
  • Detaillierte Erklärung der Verwendung von DECIMAL im MySQL-Datentyp
  • MySQL-Operationen: Operationen mit JSON-Datentyp
  • MySQL- und Oracle-Datentypkorrespondenz (tabellarische Form)
  • Von MySQL unterstützte Datentypen (Spaltentypübersicht)
  • Prinzipien der MySQL-Datentypoptimierung

<<:  Detaillierte Erklärung zur Verwendung von React.cloneElement

>>:  Reagieren Sie mit Beispielcode zur Implementierung des Anmeldeformulars

Artikel empfehlen

Detailliertes Tutorial zur Installation von Protobuf 3 unter Ubuntu

Wann ist die Installation durchzuführen? Wenn Sie...

Vue implementiert ein Beispiel für eine verschachtelte Routing-Methode

1. Verschachteltes Routing wird auch als Sub-Rout...

Lassen Sie uns über Destrukturierung in JS ES6 sprechen

Überblick es6 fügt eine neue Möglichkeit hinzu, b...

Ausführliche Erklärung dieses Schlüsselworts in JavaScript

Inhaltsverzeichnis 1. Einleitung 2. Verstehen Sie...

Hinweise zur Konfiguration mehrerer Proxys mithilfe von Vue-Projekten

Im Entwicklungsprozess eines Vue-Projekts konfigu...

Docker-Bindung mit fester IP/Hostübergreifender Container-Gegenzugriffsvorgang

Vorwort Bisher waren statische IPs, die über Pipe...

Lösen Sie schnell das Problem des langsamen Tomcat-Starts, super einfach

Heute habe ich einem Klassenkameraden geholfen, e...

Einführung in die Verwendung gängiger Dockerfile-Befehle

Inhaltsverzeichnis 01 CMD 02 EINSTIEGSPUNKT 03 AR...

vue verwendet Ele.me UI, um die Filterfunktion von Teambition zu imitieren

Inhaltsverzeichnis Problembeschreibung Die allgem...

Implementierung eines Docker-Cross-Host-Netzwerks (manuell)

1. Einführung in Macvlan Vor dem Aufkommen von Ma...

MySQL-Datenbankgrundlagen - Prinzip der Join-Operation

Join verwendet den Nested-Loop-Join-Algorithmus. ...