Maximale Speichergrößen für TINYTEXT, TEXT, MEDIUMTEXT und LONGTEXT

796

Gemäß den MySQL-Dokumenten gibt es vier TEXT-Typen:

  1. TINYTEXT
  2. TEXT
  3. MEDIUMTEXT
  4. LONGTEXT

Was ist die maximale Länge, die ich in einer Spalte jedes Datentyps speichern kann, vorausgesetzt, die Zeichenkodierung ist UTF-8?

Lalith B.
quelle
26
Nehmen Sie zum Beispiel den Typ TEXT. Es kann 65535 Datenbytes enthalten. UTF-8 enthält Multi-Byte-Zeichen. Wenn Sie das Feld nur mit dem dänischen Zeichen "Ø" ausfüllen, erhalten Sie daher nur 32767 Zeichen, da dieses UTF-8-Zeichen aus zwei Bytes besteht. Wenn Sie es mit "a" füllen, erhalten Sie 65535 Zeichen.
Andrew Plank

Antworten:

1518

Aus der Dokumentation :

      Geben Sie | ein Maximale Länge
----------- + ---------------------------------
  TINYTEXT | 255 (2 8 −1) Bytes
      TEXT | 65.535 (2 16 - 1) Bytes = 64 KiB
MEDIUMTEXT | 16.777.215 (2 24 −1) Bytes = 16 MiB
  LONGTEXT | 4,294,967,295 (2 32 -1) Bytes = 4 GiB

Beachten Sie, dass die Anzahl der Zeichen , die in Ihrer Spalte gespeichert werden können, von der Zeichencodierung abhängt .

Brücke
quelle
3
@Bridge Ich bin mir nicht sicher, ob ich das verstehe, aber das bedeutet, dass TINYTEXT bis zu 255 Zeichen enthalten kann. Stimmt das?
27.
9
@ Lykos Ja, gut - abhängig von den Charakteren. Aus der Dokumentation: A TEXT column with a maximum length of 255 (28 – 1) characters. The effective maximum length is less if the value contains multi-byte characters.Weitere Informationen finden Sie in Ankans Antwort.
Brücke
4
@ aurel.g So beantwortest du wirklich Fragen. Und ich stimme Christophe zu, so sollte mySQL seine Parameter präsentieren - auch wenn dies nur eine ergänzende Abkürzung zu ihrer ... arkanen Textansicht ist.
cbmtrx
1
Es könnte sich lohnen, hinzuzufügen, dass die Größenordnung eines Zeichens einige Bytes beträgt (min. 1, nehme ich an). Man könnte also 10.000-50.000 Zeichen in einer TEXT-Spalte speichern, ...
Vince
30
Warum ist es schwieriger, dies in den Dokumenten zu finden als im Stapelüberlauf
Boris D. Teoharov
245

Erweiterung der gleichen Antwort

  1. In diesem SO-Beitrag werden die Overheads und Speichermechanismen detailliert beschrieben.
  2. Wie aus Punkt (1) hervorgeht, sollte anstelle von TINYTEXT immer A VARCHAR verwendet werden. Bei Verwendung von VARCHAR sollte die maximale Zeilengröße jedoch 65535 Byte nicht überschreiten.
  3. Wie hier beschrieben, http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html , maximal 3 Byte für utf-8.

Dies ist eine grobe Schätzungstabelle für schnelle Entscheidungen!

  1. Also die Worst-Case-Annahmen (3 Bytes pro utf-8-Zeichen) zum besten Fall (1 Byte pro utf-8-Zeichen)
  2. Angenommen, die englische Sprache hat durchschnittlich 4,5 Buchstaben pro Wort
  3. x ist die Anzahl der zugewiesenen Bytes

xx

      Type | A= worst case (x/3) | B = best case (x) | words estimate (A/4.5) - (B/4.5)
-----------+---------------------------------------------------------------------------
  TINYTEXT |              85     | 255               | 18 - 56
      TEXT |          21,845     | 65,535            | 4,854.44 - 14,563.33  
MEDIUMTEXT |       5,592,415     | 16,777,215        | 1,242,758.8 - 3,728,270
  LONGTEXT |   1,431,655,765     | 4,294,967,295     | 318,145,725.5 - 954,437,176.6

Bitte lesen Sie auch die Antwort von Chris V: https://stackoverflow.com/a/35785869/1881812

Ankan-Zerob
quelle
4
Was ist der Grund für dieses "Ein VARCHAR sollte immer anstelle von TINYTEXT verwendet werden"? Wäre es nicht besser (weil speichereffizienter), manchmal den kleineren TINYTEXT zu verwenden?
Vlasits
24
@vlasits lesen Sie den beiliegenden SO-Beitrag für Details. (1) Alle Texttypen, einschließlich winziger Texte, werden als Objekte außerhalb der Zeile gespeichert, was einen Overhead darstellt. (2) Diese Objekte werden dann durch Adressen von 8 oder 16 Byte referenziert. Egal wie klein Ihr winziger Text ist, Sie fügen unnötigen Overhead hinzu, auch für eine maximale Größe von 255 Bytes. Es ist klar, dass Varchar verwendet werden sollte, das keinen der oben genannten Gemeinkosten hat.
Ankan-Zerob
4
@ Ankan-Zerob Da es sehr klar erscheint, dass TINYTEXT niemals über VARCHAR verwendet werden sollte, was ist der Grund dafür, es überhaupt als Option zu haben? Gibt es einen obskuren Anwendungsfall, in dem dies erforderlich ist?
nextgentech
4
@nextgentech Schauen Sie sich dev.mysql.com/doc/refman/5.0/en/column-count-limit.html an . Eine Datensatzgröße ist auf 64 KB begrenzt. Eine Tabelle ist auf 4k Spalten beschränkt. A TINYTEXTzählt 1 Byte + 8 Byte gegen die Datensatzgröße, während A VARCHAR(255)von 1 Byte + 255 Byte bis zu 2 Byte + 1020 Byte (4 Byte UTF-8-Zeichen) gegen die Datensatzgröße zählt.
Shi
2
Ich mag es, Feldgrößen in Wörtern auszudrücken, aber ... Englisch hat normalerweise ungefähr 5 Zeichen pro Wort, und es gibt auch ein Leerzeichen, das gespeichert werden muss. Englisch wird jedoch immer nahe an 1 Byte pro UTF-8-Zeichen liegen, daher würde ich durch 6 teilen, was ungefähr 40 / 10.000 / 2.700.000 / 710.000.000 Wörter für die verschiedenen Größen ergibt. Sprachen mit vielen Akzenten wie Polnisch hätten etwas weniger Wörter. Griechisch, Hebräisch, Arabisch usw. (mit meist 2-Byte-Sequenzen) etwa die Hälfte; CJK-Ideogramme sind 3- oder 4-Byte-Sequenzen, aber ich weiß nicht, wie lang Wörter sind.
ChrisV
44

Angesichts der Herausforderung von @ Ankan-Zerob ist dies meine Schätzung der maximalen Länge, die in jedem Texttyp gespeichert werden kann, gemessen in Worten :

      Type |         Bytes | English words | Multi-byte words
-----------+---------------+---------------+-----------------
  TINYTEXT |           255 |           ±44 |              ±23
      TEXT |        65,535 |       ±11,000 |           ±5,900
MEDIUMTEXT |    16,777,215 |    ±2,800,000 |       ±1,500,000
  LONGTEXT | 4,294,967,295 |  ±740,000,000 |     ±380,000,000

Im Englischen sind 4,8 Buchstaben pro Wort wahrscheinlich ein guter Durchschnitt (z. B. norvig.com/mayzner.html) ), obwohl die Wortlängen je nach Domäne variieren (z. B. gesprochene Sprache im Vergleich zu wissenschaftlichen Arbeiten), sodass es keinen Sinn macht, zu genau zu sein. Englisch besteht hauptsächlich aus Einzelbyte-ASCII-Zeichen mit sehr gelegentlichen Mehrbyte-Zeichen, so nahe an einem Byte pro Buchstabe. Für Leerzeichen zwischen Wörtern muss ein zusätzliches Zeichen zugelassen werden, daher habe ich von 5,8 Byte pro Wort abgerundet. Sprachen mit vielen Akzenten wie Polnisch würden etwas weniger Wörter speichern, ebenso wie Deutsch mit längeren Wörtern.

Sprachen, die Multi-Byte erfordern wie Griechisch, Arabisch, Hebräisch, Hindi, Thailändisch usw. usw. erfordern, erfordern in UTF-8 normalerweise zwei Bytes pro Zeichen. Ich schätze wild mit 5 Buchstaben pro Wort und habe von 11 Bytes pro Wort abgerundet.

CJK-Skripte (Hanzi, Kanji, Hiragana, Katakana usw.) Ich weiß nichts davon; Ich glaube, dass Zeichen in UTF-8 meistens 3 Bytes benötigen, und (mit massiver Vereinfachung) sie könnten ungefähr 2 Zeichen pro Wort verwenden, so dass sie irgendwo zwischen den beiden anderen liegen würden. (CJK-Skripte benötigen mit UTF-16 wahrscheinlich weniger Speicherplatz, je nachdem).

Dies ignoriert natürlich den Speicheraufwand usw.

ChrisV
quelle
CJK-Zeichen können eine 3- oder 4-Byte-Sequenz verwenden: dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
Raptor
8

Das ist schön, beantwortet aber nicht die Frage:

"Anstelle von TINYTEXT sollte immer ein VARCHAR verwendet werden." Tinytext ist nützlich, wenn Sie breite Zeilen haben - da die Daten vertraulich gespeichert werden. Es gibt einen Leistungsaufwand, der jedoch eine Verwendung hat.

colin0117
quelle