Unterschied zwischen varchar- und char-Typen in MySQL

Unterschied zwischen varchar- und char-Typen in MySQL

vorgenannt

VARCHAR und CHAR sind die beiden wichtigsten Zeichenfolgentypen. Leider ist es schwierig, genau zu erklären, wie diese Werte auf der Festplatte und im Speicher gespeichert werden, da dies von der spezifischen Implementierung der Speicher-Engine abhängt. Die folgende Beschreibung geht davon aus, dass die verwendete Speicher-Engine InnoDB und/oder MyISAM ist. Wenn Sie diese beiden Speicher-Engines nicht verwenden, lesen Sie bitte die Dokumentation der von Ihnen verwendeten Speicher-Engine.

Schauen wir uns zunächst an, wie VARCHAR- und CHAR-Werte normalerweise auf der Festplatte gespeichert werden. Beachten Sie, dass die Speicher-Engine CHAR- oder VARCHAR-Werte im Speicher und auf der Festplatte möglicherweise unterschiedlich speichert, sodass der vom MySQL-Server aus der Speicher-Engine gelesene Wert möglicherweise in ein anderes Speicherformat konvertiert werden muss.

VARCHAR-Typ

Der Typ VARCHAR wird zum Speichern von Zeichenfolgen variabler Länge verwendet und ist der am häufigsten verwendete Zeichenfolgendatentyp. Es ist platzsparender als Typen mit fester Länge, da es nur den nötigen Platz nutzt (kürzere Zeichenfolgen benötigen beispielsweise weniger Platz). Es gibt eine Ausnahme. Wenn die MySQL-Tabelle mit ROW_FORMAT=FIXED erstellt wird, wird jede Zeile mit einer festen Länge gespeichert, was zu Platzverschwendung führt.

VARCHAR erfordert 1 oder 2 zusätzliche Bytes, um die Länge der Zeichenfolge aufzuzeichnen : Wenn die maximale Länge der Spalte kleiner oder gleich 255 Bytes ist, wird nur 1 Byte zur Darstellung verwendet, andernfalls werden 2 Bytes verwendet. Bei Verwendung des Zeichensatzes Latin1 benötigt eine VARCHAR(10)-Spalte 11 Byte Speicherplatz. Eine VARCHAR(1000)-Spalte benötigt 1002 Bytes, da 2 Bytes zum Speichern der Längeninformation benötigt werden.

VARCHAR spart Speicherplatz und trägt somit auch zur Leistung bei. Da die Zeilenlänge jedoch variabel ist, kann ein UPDATE dazu führen, dass die Zeile länger wird als zuvor, was zusätzlichen Arbeitsaufwand bedeutet. Wenn die Größe einer Zeile zunimmt und auf der Seite kein Platz mehr vorhanden ist, um sie zu speichern, handhaben verschiedene Speicher-Engines diese Situation unterschiedlich. Beispielsweise teilt MyISAM die Zeile zur Speicherung in verschiedene Fragmente auf, während InnoDB die Seite aufteilen muss, damit die Zeile auf die Seite passt. Bei einigen anderen Speicher-Engines werden die Daten möglicherweise nie direkt aktualisiert.

VARCHAR anwendbare Situationen

VARCHAR ist in den folgenden Fällen geeignet:

  • Die maximale Länge einer Zeichenfolgenspalte ist viel größer als die durchschnittliche Länge
  • Aktualisierungen der Spalte sind selten, daher stellt Fragmentierung kein Problem dar
  • Bei der Verwendung komplexer Zeichensätze wie UTF-8 wird jedes Zeichen mit einer anderen Anzahl von Bytes gespeichert.

CHAR-Typ

Der CHAR-Typ hat eine feste Länge: MySQL reserviert immer genügend Speicherplatz für die definierte Zeichenfolgenlänge. Beim Speichern von CHAR-Werten entfernt MySQL alle nachstehenden Leerzeichen. CHAR-Werte werden bei Bedarf mit Leerzeichen aufgefüllt, um den Vergleich zu erleichtern.

CHAR eignet sich zum Speichern sehr kurzer Zeichenfolgen oder wenn alle Werte nahezu gleich lang sind. Beispielsweise eignet sich CHAR sehr gut zum Speichern des MD5-Werts eines Kennworts, da es sich um einen Wert mit fester Länge handelt. CHAR ist außerdem für Daten, die sich häufig ändern, besser als VARCHAR, da CHAR-Typen mit fester Länge weniger wahrscheinlich fragmentiert werden. Bei sehr kurzen Spalten ist CHAR auch speicherplatzsparender als VARCHAR. Beispielsweise erfordert die Verwendung von CHAR(1) zum Speichern von Werten, die nur Y und N enthalten, nur ein Byte, wenn ein Einzelbyte-Zeichensatz verwendet wird, aber VARCHAR(1) erfordert zwei Bytes, da ein zusätzliches Byte für die Datensatzlänge vorhanden ist.

prüfen

Das folgende Beispiel verdeutlicht den Unterschied im Verhalten zwischen CHAR und VARCHAR. Zunächst erstellen wir eine Tabelle mit nur einem CHAR(10)-Feld und fügen dort einige Werte ein:

Tabelle erstellen char_test
(
    char_col CHAR(10)
);
 
INSERT INTO char_test 
WERTE
    ('Zeichenfolge1').
    ('Zeichenfolge2').
    ('Zeichenfolge3');

Wenn wir diese Werte abrufen, stellen wir fest, dass das Leerzeichen am Ende von string3 abgeschnitten ist.

SELECT CONCAT("'", char_col, "'")
VON char_test; 

Ausführungsergebnisse

Wenn Sie ein VARCHAR(10)-Feld zum Speichern desselben Wertes verwenden, erhalten Sie das folgende Ergebnis:

Tabelle erstellen varchar_test
(
    varchar_col VARCHAR(10)
);
 
INSERT INTO varchar_test 
WERTE
    ('Zeichenfolge1').
    ('Zeichenfolge2').
    ('Zeichenfolge3');
 
SELECT CONCAT("'", varchar_col, "'")
VON varchar_test; 

Ausführungsergebnisse

Unterschiede zwischen VARCHAR(5) und VARCHAR(200)

Wenn wir VARCHAR(5) und VARCHAR(200) zum Speichern von „Hallo“ verwenden, wissen wir, dass der Speicherplatzbedarf bei beiden gleich ist. Können wir also dafür sorgen, dass die Länge von VARCHAR immer groß bleibt? Gibt es Vorteile bei der Verwendung kürzerer Spalten?

Es stellt sich heraus, dass es enorme Vorteile gibt. Längere Spalten verbrauchen mehr Speicher, da MySQL normalerweise Speicherblöcke mit fester Größe zuweist, um interne Werte zu speichern. Dies ist insbesondere dann problematisch, wenn temporäre Tabellen im Speicher sortiert oder bearbeitet werden. Beim Sortieren mithilfe temporärer Festplattentabellen ist die Situation ebenso schlecht.

Die beste Strategie besteht daher darin, nur den Speicherplatz zuzuweisen, den Sie wirklich benötigen.

Zusammenfassen

Wenn wir den Typ für ein Zeichenfolgenfeld auswählen, können wir die folgenden Aspekte berücksichtigen, um zu bestimmen, ob wir VARCHAR oder CHAR auswählen:

  • Überprüfen Sie, ob die durchschnittliche Länge des Felddatensatzes sehr nahe an der maximalen Länge liegt. Wenn der Unterschied sehr gering ist, berücksichtigen Sie zuerst den CHAR-Typ. Andernfalls berücksichtigen Sie den VARCHAR-Typ.
  • Wenn das Feld einen Hash-Wert nach MD5 oder einen Wert mit fester Länge speichert, wird der CHAR-Typ bevorzugt.
  • Wenn das Feld häufig aktualisiert werden muss, wird dem CHAR-Typ Vorrang eingeräumt, da der CHAR-Typ eine feste Länge hat und weniger wahrscheinlich fragmentiert wird.
  • Für Feldwerte, die sehr kleine Informationen speichern, wie etwa das Geschlecht, wird der CHAR-Typ bevorzugt, da der VARCHAR-Typ zusätzliche Bytes benötigt, um Informationen zur Zeichenfolgenlänge zu speichern.

Kurz gesagt, wenn wir den CHAR-Typ auswählen können oder wenn der Platzverbrauch relativ gesehen nicht im Mittelpunkt der Einflussfaktoren steht, versuchen Sie, den CHAR-Typ auszuwählen, da der CHAR-Typ in anderen Aspekten mehr oder weniger Vorteile bietet. Wenn der Speicherplatzverbrauch zu einem wichtigen Faktor wird, ziehen wir die Verwendung des Typs VARCHAR in Betracht.

Dies ist das Ende dieses Artikels über den Unterschied zwischen den Typen varchar und char in MySQL. Weitere Informationen zu den Typen varchar und char in MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Als der Interviewer nach dem Unterschied zwischen char und varchar in mysql fragte
  • Der Unterschied zwischen char und varchar in MySQL
  • Der Unterschied zwischen den Feldtypen char, varchar und Text in MySQL
  • Der Unterschied zwischen VARCHAR- und CHAR-Formatdaten in MySQL
  • Analyse der Unterschiede zwischen char und varchar in der MySQL-Datenbank und Verwendungsvorschläge
  • Analyse des Unterschieds zwischen char und varchar in MySQL

<<:  So implementieren Sie ein Hover-Dropdown-Menü mit CSS

>>:  Vue implementiert Fuzzy-Abfrage-MySQL-Datenbankdaten

Artikel empfehlen

MySQL-Lösung zur Datenpaging-Abfrageoptimierung auf Millionenebene

Wenn die Tabelle Zehntausende Datensätze enthält,...

So konfigurieren Sie mehrere Projekte mit demselben Domänennamen in Nginx

Es gibt zwei Möglichkeiten, mit Nginx mehrere Pro...

Implementierungsschritte für die Docker-Bereitstellung lnmp-wordpress

Inhaltsverzeichnis 1. Experimentelle Umgebung 2. ...

Ideen und Methoden zur inkrementellen Sicherung einer MySQL-Datenbank

Um eine inkrementelle Sicherung der MySQL-Datenba...

Detaillierte Erklärung der CSS-Animationsattribut-Keyframes

Wie lange ist es her, dass ich meine Kolumne aktu...

Nginx-Lastausgleichskonfiguration, automatischer Umschaltmodus bei Ausfallzeiten

Streng genommen verfügt nginx nicht über eine Int...

Detaillierte Erklärung zur JavaScript-Datenabflachung

Inhaltsverzeichnis Was ist Abflachung? Rekursion ...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.24

MySQL ist das beliebteste relationale Datenbankma...