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

Zusammenfassung von 3 Möglichkeiten zum verzögerten Laden eines Vue-Routers

Kein Lazy Loading verwenden importiere Vue von „v...

Spezifische Verwendung von GNU Parallel

Was ist das? GNU Parallel ist ein Shell-Tool zum ...

Vue.js-Framework implementiert Warenkorbfunktion

In diesem Artikel wird der spezifische Code des V...

So verwenden Sie Nginx zum Erstellen eines statischen Ressourcenservers

Nehmen wir Windows als Beispiel. Bei Linux ist es...

Beispielcode zum Ändern des Textstils der Eingabeaufforderung in HTML

Auf vielen Websites wird im Eingabefeld Hinweiste...

Einige etwas komplexere Verwendungsbeispielcodes in MySQL

Vorwort Ich glaube, dass die Syntax von MySQL nic...

Detaillierte Erklärung inkompatibler Änderungen von Komponenten in vue3

Inhaltsverzeichnis Funktionale Komponenten So sch...

Detaillierte Erklärung zum Einrichten eines DNS-Servers unter Linux

1. DNS-Server-Konzept Die Kommunikation im Intern...

Beschreibung der HTML-Meta-Viewport-Attribute

Was ist ein Ansichtsfenster? Mobile Browser platz...

Erfahren Sie mehr über die MySQL-Speicher-Engine

Inhaltsverzeichnis Vorwort 1. MySQL-Hauptspeicher...