it-swarm.com.de

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

Per die MySQL-Dokumente gibt es vier TEXT-Typen:

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

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

723
Lalith B

Aus der Dokumentation :

 Typ | Maximale Länge 
 ----------- + --------------------------- ------ 
 TINYTEXT | 255 (2 8−1) Bytes 
 TEXT | 65,535 (216−1) Bytes = 64 KiB 
 MEDIUMTEXT | 16.777.215 (224−1) Bytes = 16 MiB 
 LONGTEXT | 4,294,967,295 (232−1) Bytes = 4 GiB 

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

1429
Bridge

Erweiterung der gleichen Antwort

  1. In diesem SO post werden die Gemeinkosten und Speichermechanismen im Detail beschrieben.
  2. Wie aus Punkt (1) hervorgeht, sollte immer A VARCHAR anstelle von TINYTEXT 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 Bytes für utf-8.

DIESES IS EINE ROHE SCHÄTZUNGSTABELLE FÜR SCHNELLE ENTSCHEIDUNGEN!

  1. Also die Worst-Case-Annahmen (3 Bytes pro utf-8 Zeichen) zum Best-Case (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

x-x

      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

229
Ankan-Zerob

In Anbetracht 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

In Englisch sind 4,8 Buchstaben pro Wort wahrscheinlich ein guter Durchschnitt (z. B. norvig.com/mayzner.html ), obwohl Word Die Längen variieren je nach Fachgebiet (z. B. gesprochene Sprache im Vergleich zu akademischen Arbeiten). Es macht also keinen Sinn, zu genau zu sein. Englisch besteht hauptsächlich aus Einzelbyte-Zeichen ASCII, mit gelegentlichen Mehrbyte-Zeichen, die einem Byte pro Buchstabe sehr nahe kommen. Für Leerzeichen zwischen Wörtern muss ein zusätzliches Zeichen zulässig sein, daher habe ich von 5,8 Bytes pro Wort abgerundet. Sprachen mit vielen Akzenten wie Polnisch würden etwas weniger Wörter speichern, wie dies z. Deutsch mit längeren Wörtern.

Sprachen, die Mehrbyte-Zeichen wie Griechisch, Arabisch, Hebräisch, Hindi, Thailändisch usw. erfordern, erfordern in UTF-8 in der Regel zwei Byte pro Zeichen. Bei 5 Buchstaben pro Wort habe ich wild gerundet von 11 Bytes pro Wort.

CJK-Skripte (Hanzi, Kanji, Hiragana, Katakana usw.), von denen ich nichts weiß; Ich glaube, dass Zeichen in UTF-8 meistens 3 Bytes benötigen, und (mit massiver Vereinfachung), dass sie ungefähr 2 Zeichen pro Wort verwenden, sodass sie irgendwo zwischen den anderen beiden liegen. (Abhängig von CJK-Skripten ist mit UTF-16 wahrscheinlich weniger Speicherplatz erforderlich.).

Dies ignoriert natürlich den Speicheraufwand usw.

40
ChrisV

Das ist Nizza, beantwortet aber nicht die Frage:

"Ein VARCHAR sollte immer anstelle von TINYTEXT verwendet werden." Tinytext ist nützlich, wenn Sie breite Zeilen haben, da die Daten außerhalb des Datensatzes gespeichert werden. Es gibt einen Performance-Overhead, der jedoch einen Nutzen hat.

6
colin0117