Die oben genannten
VARCHAR und CHAR sind die beiden Hauptzeichenfolgentypen. 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. In der folgenden Beschreibung wird davon ausgegangen, 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.
Sehen wir uns zunächst an, wie VARCHAR- und CHAR-Werte normalerweise auf der Festplatte gespeichert werden. Bitte beachten Sie, dass die Art und Weise, wie die Speicher-Engine CHAR- oder VARCHAR-Werte im Speicher speichert, anders sein kann als auf der Festplatte, sodass die vom MySQL-Server aus der Speicher-Engine gelesenen Werte möglicherweise in ein anderes Speicherformat konvertiert werden müssen.
VARCHAR-Typ
VARCHAR-Typ wird zum Speichern von Zeichenfolgen variabler Länge verwendet und ist der häufigste Zeichenfolgendatentyp. Er ist platzsparender als Typen mit fester Länge, da er nur den erforderlichen Platz beansprucht (kürzere Zeichenfolgen verbrauchen beispielsweise weniger Platz). Es gibt eine Ausnahme: Wenn die MySQL-Tabelle mit ROW_FORMAT=FIXED erstellt wird, wird jede Zeile mit fester Länge gespeichert, wodurch Speicherplatz verschwendet wird.
VARCHAR benötigt 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 2 Bytes gebraucht. Unter der Annahme, dass der Zeichensatz latin1 verwendet wird, benötigt eine VARCHAR(10)-Spalte 11 Byte Speicherplatz. Die Spalte VARCHAR(1000) benötigt 1002 Byte, da 2 Byte zum Speichern der Längeninformationen benötigt werden.
VARCHAR spart Speicherplatz und trägt so auch zur Leistung bei. Da die Zeile jedoch eine variable Länge hat, kann es sein, dass die Zeile beim UPDATE länger als das Original wird, was zusätzliche Arbeit erfordert. Wenn der von einer Zeile belegte Platz wächst und auf der Seite kein Platz mehr zum Speichern vorhanden ist, gehen verschiedene Speicher-Engines unterschiedlich mit dieser Situation um. Beispielsweise teilt MyISAM die Zeilen zur Speicherung in verschiedene Fragmente auf, und InnoDB muss die Seite aufteilen, damit die Zeilen in die Seite passen. Einige andere Speicher-Engines aktualisieren die Daten möglicherweise nie am ursprünglichen Datenspeicherort.
VARCHAR anwendbare Situationen
Es ist angemessen, VARCHAR in den folgenden Situationen anzuwenden:
Die maximale Länge der Zeichenfolgenspalte ist viel größer als die durchschnittliche Länge
Spalten werden selten aktualisiert, daher stellt Fragmentierung kein Problem dar
Es wird ein komplexer Zeichensatz wie UTF-8 verwendet, jedes Zeichen wird mit einer anderen Anzahl von Bytes gespeichert
CHAR-Typ
Der CHAR-Typ hat eine feste Länge: MySQL weist immer genügend Speicherplatz entsprechend der definierten String-Länge zu. Beim Speichern von CHAR-Werten entfernt MySQL alle nachgestellten Leerzeichen. Der CHAR-Wert wird nach Bedarf mit Leerzeichen aufgefüllt, um den Vergleich zu erleichtern.
CHAR eignet sich zum Speichern sehr kurzer Zeichenfolgen oder alle Werte sind nahezu gleich lang. CHAR eignet sich beispielsweise ideal zum Speichern des MD5-Werts eines Passworts, da es sich um einen Wert fester Länge handelt. Für Daten, die sich häufig ändern, ist CHAR auch besser als VARCHAR, da der CHAR-Typ mit fester Länge nicht anfällig für Fragmentierung ist. CHAR ist außerdem für sehr kurze Spalten speicherplatzeffizienter als VARCHAR. CHAR(1) wird beispielsweise nur zum Speichern von Y- und N-Werten verwendet. Wenn ein Einzelbyte-Zeichensatz verwendet wird, ist nur ein Byte erforderlich, VARCHAR(1) erfordert jedoch zwei Bytes, da für den Datensatz ein zusätzliches Byte vorhanden ist Länge. .
Test
Das Folgende ist ein Beispiel, um den Unterschied im Verhalten zwischen CHAR und VARCHAR zu veranschaulichen. Zuerst erstellen wir eine Tabelle mit nur einem CHAR(10)-Feld. und Fügen Sie einige Werte ein:
CREATE TABLE char_test ( char_col CHAR(10) ); INSERT INTO char_test VALUES ('string1'). (' string2'). ('string3 ');
Wenn wir diese Werte abrufen, werden wir feststellen, dass die Leerzeichen am Ende von string3 abgeschnitten sind.
SELECT CONCAT("'", char_col, "'") FROM char_test;
Ausführungsergebnis:
Wenn Sie das Feld VARCHAR(10) verwenden, um denselben Wert zu speichern, können Sie das folgende Ergebnis erhalten:
CREATE TABLE varchar_test ( varchar_col VARCHAR(10) ); INSERT INTO varchar_test VALUES ('string1'). (' string2'). ('string3 '); SELECT CONCAT("'", varchar_col, "'") FROM varchar_test;
Ausführungsergebnis
Der Unterschied zwischen VARCHAR(5) und VARCHAR(200)
Wenn wir VARCHAR(5 ) und VARCHAR(200 ) zum Speichern von „Hallo“, wissen wir, dass der Speicherplatzaufwand bei beiden gleich ist. Können wir also die Länge von VARCHAR immer groß halten? Gibt es Vorteile bei der Verwendung kürzerer Spalten?
Es stellt sich als großer Vorteil heraus. Längere Spalten verbrauchen mehr Speicher, da MySQL normalerweise Speicherblöcke mit fester Größe für die Speicherung interner Werte zuweist. Dies ist besonders schlimm, wenn temporäre In-Memory-Tabellen zum Sortieren oder für Vorgänge verwendet werden. Ebenso schlimm ist es beim Sortieren mithilfe temporärer Festplattentabellen.
Die beste Strategie besteht also darin, nur den Platz zuzuweisen, den Sie wirklich benötigen.
Zusammenfassung
Wenn wir einen Typ für ein Zeichenfolgentypfeld auswählen, können wir bei der Entscheidung, ob wir VARCHAR oder CHAR wählen, die folgenden Aspekte berücksichtigen:
Gibt es einen kleinen Unterschied zwischen der durchschnittlichen Länge und der maximalen Länge des Felddatensatzes? Wenn der Unterschied gering ist, geben Sie dem Typ CHAR Vorrang. Andernfalls ziehen Sie den Typ VARCHAR in Betracht.
Wenn das Feld einen Hash-Wert nach MD5 oder einen Wert fester Länge speichert, wird der CHAR-Typ bevorzugt.
Wenn das Feld häufig aktualisiert werden muss, erhält der CHAR-Typ Vorrang. Da der CHAR-Typ eine feste Länge hat, ist er nicht anfällig für Fragmentierung.
Für Feldwerte, die sehr kleine Informationen speichern, wie z. B. das Geschlecht, wird der CHAR-Typ bevorzugt, da der VARCHAR-Typ zusätzliche Bytes zum Speichern von Informationen zur Zeichenfolgenlänge belegt.
Mit einem Wort: Wenn wir den CHAR-Typ auswählen können oder wenn der Platzverbrauch relativ nicht im Mittelpunkt der Einflussfaktoren steht, versuchen Sie, den CHAR-Typ zu wählen, da der CHAR-Typ in anderen Aspekten mehr oder weniger hat weniger Vorteile. Wenn der Platzverbrauch zu einem großen Einflussfaktor wird, werden wir die Verwendung des Typs VARCHAR in Betracht ziehen.
Empfohlenes Tutorial: „MySQL-Tutorial“
Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen CHAR und VARCHAR in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!