MySQL char & varchar character sets & storage-Größen
Frage mich, wie viel tatsächlichen Speicher-Platz wird eingenommen durch diese zwei Datentypen, wie in der MySQL-Dokumentation ist etwas unklar in der Sache.
CHAR(M) M × w bytes, 0 <= M <= 255, wo w ist die Anzahl bytes, die
erforderlich für die maximale Länge Zeichen in den ZeichensatzVARCHAR(M), VARBINARY(M) L + 1 bytes, wenn die Spalte Werte 0 – 255
bytes, L + 2 bytes, wenn Werte erfordern mehr als 255 bytes
Scheint dies zu implizieren mir, dass angesichts einer utf8-kodierten Datenbank, ein CHAR wird immer 32 bit pro Zeichen, während ein VARCHAR-zwischen 8 und 32 in Abhängigkeit von den tatsächlichen byte-Länge der Zeichen gespeichert. Ist das richtig? Oder hat einer von VARCHAR bedeuten, ein 8-bit-Zeichen Breite, und die Speicherung von multi-Byte-UTF8-Zeichen tatsächlich verbraucht mehrere 'Zeichen' aus dem VARCHAR? Oder ist das VARCHAR auch immer Speicher 32 bits pro Zeichen? So viele Möglichkeiten.
Nicht etwas, das ich jemals hatte, zu sorgen, so viel über, bevor, aber ich bin angefangen zu schlagen, in-memory-temp-Tabelle Größe begrenzt ist und ich nicht unbedingt haben wollen, zu erhöhen, MySQL verfügbaren pool (zum zweiten mal).
Du musst angemeldet sein, um einen Kommentar abzugeben.
CHAR
undVARCHAR
beide zählen Zeichen. Beide zählen Sie die maximale Speicherkapazität, die Sie benötigen könnten angesichts der Zeichen-Codierung und Länge. Für ASCII, das ist 1 byte pro Zeichen. Für UTF-8, die 3 Byte pro Zeichen (nicht 4, wie man erwarten würde, weil MySQL ist die Unicode-Unterstützung ist verkrüppelt für einige Grund, und es unterstützt nicht alle Unicode-Zeichen, die erfordern würde, 4 bytes in der UTF-8). BisherCHAR
undVARCHAR
sind die gleichen.Nun
CHAR
nur geht Voraus und behält sich vor, diese Menge an Speicher.VARCHAR
anstatt zugeordnet 1 oder 2 bytes, abhängig davon, ob dieser die maximale Speicherkapazität ist < 256 oder ≥ 256. Und die tatsächliche Menge an Speicherplatz belegt durch den Eintrag ist ein oder zwei bytes, plus die Menge der Raum tatsächlich belegt ist, die durch den string.Interessant, das macht 85 eine Magische Zahl für UTF-8
VARCHAR
:VARCHAR(85)
verwendet 1 byte für die Länge, weil die maximal mögliche Länge von 85 (verkrüppelt) UTF-8-Zeichen ist 3 x 85 = 255.VARCHAR(86)
verwendet 2 byte für die Länge, da die maximale mögliche Länge von 86 (verkrüppelt) UTF-8-Zeichen ist 3 × 86 = 258.utf8
- Speicher ist nicht nur verkrüppelt, es ist nicht Ihr standard-UTF-8 entweder.utf8
- kodierte strings gespeichert, etwa das doppelte der Speicherung von regelmäßigen UTF-8-kodierte strings, so dass es noch ineffizient.COMPACT
undREDUNDANT
), so dass der Raum besetzt durch eine Zeile hängt davon ab, was man im Einsatz ist. Es ist nicht mehr so einfach, wie es einmal war, wenn die nur-Speicher-engine, die allgemein verwendet wurde MyISAM. Trotzdem, ein 1-byte-Unterschied, den es negligeable sowieso. Sie sind eher besorgt über die maximale Länge des Schlüssels in InnoDB, die 768 bytes. So eine UTF-8 Datentyp VARCHAR(256) kann nicht Teil eines Schlüssels. Ein UTF-8 VARCHAR(255) - Feld kann ein Schlüssel.