Ich frage mich, wie viel Speicherplatz tatsächlich von diesen beiden Datentypen beansprucht wird, da die MySQL-Dokumentation in dieser Angelegenheit etwas unklar ist.
CHAR (M) M × w Bytes, 0 & lt; = M & lt; = 255, wobei w die Anzahl der Bytes ist erforderlich für das Zeichen mit der maximalen Länge im Zeichensatz
VARCHAR (M), VARBINÄR (M) L + 1 Byte, wenn Spaltenwerte 0 - 255 erfordern Bytes, L + 2 Bytes, wenn Werte mehr als 255 Bytes benötigen
Dies scheint mir zu implizieren, dass bei einer utf8-kodierten Datenbank ein CHAR immer 32 Bits pro Zeichen belegt, während ein VARCHAR zwischen 8 und 32 abhängig von der tatsächlichen Byte-Länge der gespeicherten Zeichen benötigt. Ist das korrekt? Oder impliziert ein VARCHAR eine 8-Bit-Zeichenbreite, und das Speichern von UTF8-Zeichen mit mehreren Oktetts verbraucht tatsächlich mehrere Zeichen aus dem VARCHAR? Oder speichert der VARCHAR auch immer 32 Bits pro Zeichen? So viele Möglichkeiten.
Nicht etwas, worüber ich mir jemals so Sorgen machen musste, aber ich fange an, die Speichergröße der Speichergröße zu überschreiten und ich möchte nicht unbedingt den verfügbaren Pool von MySQL erhöhen (zum zweiten Mal) ).
CHAR
und VARCHAR
zählen beide Zeichen. Beide zählen bei der Zeichencodierung und -länge den maximal möglichen Speicherplatz. Für ASCII ist das 1 Byte pro Zeichen. Für UTF-8 sind das 3 Byte pro Zeichen (nicht 4, wie Sie erwarten würden, weil Die Unicode-Unterstützung von MySQL ist aus irgendeinem Grund eingeschränkt und unterstützt keine Unicode-Zeichen, die 4 Byte in UTF-8 benötigen. Bisher sind CHAR
und VARCHAR
gleich.
Nun geht CHAR
einfach weiter und reserviert diese Speichermenge.
VARCHAR
weist stattdessen 1 oder 2 Bytes zu, abhängig davon, ob dieser maximale Speicher & lt; 256 oder ≥ 256. Und die tatsächliche Menge an Speicherplatz, die von dem Eintrag belegt wird, sind diese ein oder zwei Bytes plus die Menge an Speicherplatz, die tatsächlich von der Zeichenfolge belegt wird.
Interessanterweise ist dies eine magische Zahl für UTF-8 VARCHAR
:
VARCHAR(85)
verwendet 1 Byte für die Länge, da die maximal mögliche Länge von 85 (verkrüppelten) UTF-8-Zeichen 3 × 85 = 255 ist. VARCHAR(86)
verwendet 2 Byte für die Länge, da die maximal mögliche Länge von 86 (verkrüppelten) UTF-8-Zeichen 3 × 86 = 258 beträgt. Tags und Links mysql character-encoding sqldatatypes