web-dev-qa-db-fra.com

TINYTEXT, TEXT, MEDIUMTEXT et LONGTEXT, tailles maximales de stockage

Per les documents MySQL , il existe quatre types de texte:

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

Quelle est la longueur maximale que je peux stocker dans une colonne de chaque type de données en supposant que le codage de caractères est UTF-8?

723
Lalith B

De la documentation :

 Type | Longueur maximale 
 ----------- + ------------------------------- ------ 
 TINYTEXT | 255 (2 8−1) octets 
 TEXT | 65 535 (216−1) bytes = 64 KiB 
 MEDIUMTEXT | 16 777 215 (224−1) octets = 16 Mio 
 LONGTEXT | 4 294 967 295 (232−1) octets = 4 Gio 

Notez que le nombre de caractères pouvant être stockés dans votre colonne dépend du codage de caractères .

1429
Bridge

Expansion de la même réponse

  1. Ce SO post décrit en détail les frais généraux et les mécanismes de stockage.
  2. Comme indiqué au point (1), un VARCHAR doit toujours être utilisé à la place de TINYTEXT. Toutefois, lorsque vous utilisez VARCHAR, la taille maximale de la ligne ne doit pas dépasser 65 535 octets.
  3. Comme indiqué ici http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html , maximum 3 octets pour utf-8.

CECI IS UN TABLEAU D’ESTIMATION POUR DES DÉCISIONS RAPIDES!

  1. Donc, les hypothèses les plus défavorables (3 octets par caractère utf-8) au meilleur des cas (1 octet par caractère utf-8)
  2. En supposant que la langue anglaise a une moyenne de 4,5 lettres par mot
  3. x est le nombre d'octets alloués

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

Veuillez vous reporter également à la réponse de Chris V: https://stackoverflow.com/a/35785869/1881812

229
Ankan-Zerob

Relevant le défi de @ Ankan-Zerob, voici mon estimation de la longueur maximale pouvant être stockée dans chaque type de texte mesurée en mots :

      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

En anglais , 4,8 lettres par mot est probablement une bonne moyenne (par exemple, norvig.com/mayzner.html ), bien que Word les longueurs varient en fonction du domaine (par exemple, la langue parlée par rapport aux papiers académiques), il est donc inutile d'être trop précis. L'anglais est principalement composé de ASCII caractères sur un octet, avec des caractères occasionnels sur plusieurs octets, si proches d'un octet par lettre. Un caractère supplémentaire doit être autorisé pour les espaces inter-mots. J'ai donc arrondi à 5,8 octets par mot. Les langues avec beaucoup d’accents, comme le polonais par exemple, stockeront un peu moins de mots, comme par exemple Allemand avec des mots plus longs.

Les langues nécessitant des caractères multi-octets tels que le grec, l'arabe, l'hébreu, l'hindi, le thaï, etc., nécessitent généralement deux octets par caractère en UTF-8. Devinant sauvagement à 5 lettres par mot, j'ai arrondi à 11 octets par mot.

Les scripts CJK (Hanzi, Kanji, Hiragana, Katakana, etc.) Je ne connais rien; Je pense que les caractères nécessitent principalement 3 octets en UTF-8, et (avec une simplification énorme), ils pourraient utiliser environ 2 caractères par mot, ils seraient donc quelque part entre les deux autres. (Les scripts CJK nécessiteront probablement moins de stockage avec UTF-16, en fonction).

Ceci est bien sûr ignorer les frais généraux de stockage, etc.

40
ChrisV

C'est gentil mais ne répond pas à la question:

"Un VARCHAR doit toujours être utilisé à la place de TINYTEXT." Tinytext est utile si vous avez des lignes larges, car les données sont stockées hors de l’enregistrement. Il y a un surcoût lié aux performances, mais il a une utilité.

6
colin0117