TINYTEXT, TEXT, MEDIUMTEXT und LONGTEXT maximale Speichergrößen

In 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, wenn die Zeichencodierung UTF-8 ist?

    Aus der Dokumentation :

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

    Erweiterung der gleichen Antwort

    1. Dieser SO-Post: varchar (255) vs tinytext / tinyblob und varchar (65535) vs Blob / Text umreißt im Detail die Gemeinkosten und Speichermechanismen.
    2. Wie aus Punkt (1) hervorgeht, sollte immer ein VARCHAR anstelle von TINYTEXT verwendet werden. Bei Verwendung von VARCHAR sollte die maximale Zeilengröße 65535 Byte jedoch 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.

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

    1. Also die Worst-Case-Annahmen (3 Byte pro utf-8 char) zum besten Fall (1 Byte pro utf-8 char)
    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 | 21845 | 65,535 | 4854.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 

    Siehe auch die Antwort von Chris V. https://stackoverflow.com/a/35785869/1881812

    Auf Ankan-Zerobs Herausforderung hin steigend, ist dies meine Schätzung der maximalen Länge, die in jedem Texttyp in Worten gespeichert werden kann:

      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 die Wortlängen je nach Domäne variieren (z. B. gesprochene Sprache vs. akademische Arbeiten), daher ist es nicht sinnvoll, zu genau zu sein. Englisch ist meist Single-Byte-ASCII-Zeichen, mit sehr gelegentlichen Multi-Byte-Zeichen, also fast ein Byte pro Buchstabe. Ein zusätzliches Zeichen muss für Zwischenwortzwischenräume erlaubt sein, so dass ich von 5,8 Bytes pro Wort abgerundet habe. Sprachen mit vielen Akzenten wie zB Polnisch würden etwas weniger Wörter speichern, als zB Deutsch mit längeren Wörtern.

    Sprachen, die Multi-Byte- Zeichen wie Griechisch, Arabisch, Hebräisch, Hindi, Thai usw. benötigen, benötigen normalerweise zwei Bytes pro Zeichen in UTF-8. Mit 5 Buchstaben pro Wort rate ich ab 11 Bytes pro Wort.

    CJK-Skripte (Hanzi, Kanji, Hiragana, Katakana usw.) Ich weiß nichts davon; Ich glaube, dass Zeichen in UTF-8 meist 3 Byte benötigen, und (mit massiver Vereinfachung) könnten sie etwa 2 Zeichen pro Wort verwenden, so dass sie irgendwo zwischen den beiden anderen liegen würden. (CJK-Skripts benötigen wahrscheinlich weniger Speicherplatz, wenn UTF-16 verwendet wird).

    Das ignoriert natürlich Speicher-Overhead usw.

    Das ist nett, aber beantwortet die Frage nicht:

    “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 performancesaufwand, aber es hat einen Nutzen.