MySQL char & varchar Zeichensätze & Speichergrößen

8

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) ).

    
pospi 10.04.2012, 00:19
quelle

1 Antwort

8

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.
Celada 10.04.2012, 00:35
quelle