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

Win2008 R2 MySQL 5.5 ZIP-Format MySQL-Installation und -Konfiguration

Installation und Konfiguration von MySQL im ZIP-F...

Verwendung des Linux-Befehls sed

1. Funktionseinführung sed (Stream EDitor) ist ei...

Eine kurze Analyse kontrollierter und unkontrollierter Komponenten in React

Inhaltsverzeichnis Unkontrollierte Komponenten Ko...

Manuelle Implementierung der Instanceof-Methode in JavaScript

1. Verwendung von instanceof Mit instanceof wird ...

So konfigurieren Sie den Runner-Container in Docker

1. Erstellen Sie einen Runner-Container mk@mk-pc:...

Beispiel für die reguläre Umschreibmethode für Nginx Rewrite (Matching)

Die Rewrite-Funktion von Nginx unterstützt regelm...

Zusammenfassung des fragmentierten Wissens zum Docker-Management

Inhaltsverzeichnis 1. Übersicht 2. Anwendungsbeis...

Detaillierte Erläuterung des Apache SkyWalking-Alarmkonfigurationshandbuchs

Apache SkyWalking Apache SkyWalking ist ein Tool ...

Javascript zum Wechseln von Bildern per Mausklick

In diesem Artikelbeispiel wird der spezifische Ja...

MySQL-Reihe von Erfahrungszusammenfassungen und Analyse-Tutorials zu NULL-Werten

Inhaltsverzeichnis 1. Testdaten 2. Die Unannehmli...

Beispiel für die Implementierung des Lastausgleichs mit Nginx+SpringBoot

Einführung in den Lastenausgleich Bevor wir die L...