2012-04-10 12 views
8

Ich frage mich, wie viel tatsächlicher Speicherplatz von diesen beiden Datentypen beansprucht wird, da die MySQL-Dokumentation in dieser Angelegenheit etwas unklar ist.MySQL char & varchar Zeichensätze & Speichergrößen

CHAR (M) M × w Bytes, 0 < = M < = 255, wobei w die Anzahl von Bytes ist für die Maximallängen-Zeichen in dem Zeichen

gesetzt erforderlich

VARCHAR (M) , VARBINARY (M) L + 1 Bytes, wenn Spaltenwerte erfordern 0 - 255 Bytes, L + 2 Bytes, wenn Werte können mehr als 255 Byte

erfordern Dies scheint mir zu implizieren, dass bei einer UTF-8-encoded Datenbank wird ein CHAR immer 32 Bits pro Zeichen einnehmen, während ein VARCHAR dauert zwischen 8 und 32 abhängig von der tatsächlichen Byte-Länge der gespeicherten Zeichen. 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, um das ich mich schon so lange Sorgen machen musste, aber ich fange an, in-memory temp-Tabellengrößenlimits zu treffen und ich möchte nicht notwendigerweise den verfügbaren Pool von MySQL vergrößern Zeit).

Antwort

8

CHAR und VARCHAR beide Zählzeichen. 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 Bytes pro Zeichen (nicht 4, wie man erwarten würde, weil MySQL's Unicode support is crippled aus irgendeinem Grund, und es unterstützt keine Unicode-Zeichen, die 4 Bytes in UTF-8 erfordern würden). Bisher sind CHAR und VARCHAR gleich.

Nun geht CHAR einfach los und reserviert diese Menge an Speicher. Stattdessen werden 1 oder 2 Bytes zugewiesen, abhängig davon, ob dieser maximale Speicher < 256 oder ≥ 256 ist. Und die tatsächliche Menge an Speicherplatz, die durch den Eintrag belegt wird, sind diese ein oder zwei Bytes plus der tatsächlich belegte Speicherplatz die Saite.

Interessanterweise macht 85 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 beträgt 3 × 85 = 255.
  • VARCHAR(86) 2 Byte für die Länge verwendet, da die maximal mögliche Länge von 86 (verkrüppelten) UTF-8-Zeichen 3 × 86 = 258.
+1

diejenigen, MySQLs 'utf8' Speicherung hinzuzufügen, ist nicht nur verkrüppelt, es ist nicht dein Standard UTF-8 entweder. 'utf8'-codierte Strings werden mit ungefähr der doppelten Speicherkapazität von regulären UTF-8-codierten Strings gespeichert, was sie noch ineffizienter macht. – deceze

+0

@deceze Ich war mir dessen nicht bewusst. Haben Sie irgendwelche Details oder Hinweise dazu? – Celada

+0

Ich wünschte, ich hätte es getan, aber die Dokumentation sagt nicht viel darüber aus. Es gab kürzlich eine Frage darüber, wie die Datenbank gedumpt werden sollte, wo Daten in binärer Form ausgegeben wurden, was sehr offensichtlich ist. – deceze