Tamanhos máximos de armazenamento TINYTEXT, TEXT, MEDIUMTEXT e LONGTEXT

796

De acordo com os documentos do MySQL , existem quatro tipos de texto:

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

Qual é o tamanho máximo que posso armazenar em uma coluna de cada tipo de dados, assumindo que a codificação de caracteres é UTF-8?

Lalith B
fonte
26
Tomemos, por exemplo, o tipo de texto. Pode conter 65535 bytes de dados. UTF-8 contém caracteres de vários bytes. Portanto, se você preenchesse o campo usando apenas o caractere dinamarquês "Ø", obteria apenas 32767 caracteres, pois esse caractere UTF-8 é composto por dois bytes. Se você o preenchesse com "a", obteria 65535 caracteres.
Andrew Plank
1
Considere também ler que tipo de dados é melhor usar texto ou VARCHAR
Somnath Muluk

Respostas:

1518

A partir da documentação :

      Tipo | Comprimento máximo
----------- + -------------------------------------
  TINYTEXT 255 (2 8 −1) bytes
      TEXTO 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

Observe que o número de caracteres que podem ser armazenados em sua coluna dependerá da codificação de caracteres .

Ponte
fonte
3
@Bridge Não sei se entendi, mas isso significa que o TINYTEXT pode ter até 255 caracteres, estou certo ???
ltdev
9
@ Lykos Sim, bem - dependendo dos personagens. Na documentação: 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.consulte a resposta da Ankan para obter mais detalhes.
Bridge
4
@ aurel.g É assim que você realmente responde à pergunta. E eu concordo com Christophe, é assim que o mySQL deve apresentar seus parâmetros - mesmo que apenas como uma abreviação suplementar à sua ... exibição de texto arcano.
Cbmtrx
1
Vale a pena acrescentar que a ordem de magnitude de um caractere é de alguns bytes (mínimo 1, suponho). Assim, pode armazenar 10.000-50.000 caracteres em uma coluna de texto, ...
Vince
30
Por que é mais difícil de encontrar este na documentação do que em stackoverflow
Boris D. Teoharov
245

Expansão da mesma resposta

  1. Esta publicação do SO descreve detalhadamente as despesas gerais e os mecanismos de armazenamento.
  2. Conforme observado no ponto (1), um VARCHAR sempre deve ser usado em vez de TINYTEXT. No entanto, ao usar VARCHAR, o tamanho máximo da linha não deve exceder 65535 bytes.
  3. Conforme descrito aqui http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html , no máximo 3 bytes para utf-8.

ESTA É UMA TABELA DE ESTIMATIVA ÁSPERA PARA DECISÕES RÁPIDAS!

  1. Portanto, as hipóteses de pior caso (3 bytes por caractere utf-8) para melhor caso (1 byte por caractere utf-8)
  2. Supondo que o idioma inglês tenha uma média de 4,5 letras por palavra
  3. x é o número de bytes alocados

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

Consulte também a resposta de Chris V: https://stackoverflow.com/a/35785869/1881812

Ankan-Zerob
fonte
4
Qual é a justificativa para isso "Um VARCHAR sempre deve ser usado em vez de TINYTEXT"? Não seria melhor (porque é mais eficiente em armazenamento) usar o TINYTEXT menor às vezes?
vlasits
24
O @vlasits lê a publicação SO incluída para obter detalhes. (1) todos os tipos de texto, incluindo texto minúsculo, são armazenados como objetos fora da linha, com uma sobrecarga (2). Esses objetos são referenciados pelos endereços 8 ou 16 bytes. portanto, não importa quão pequeno seja o seu texto minúsculo, você estará adicionando sobrecargas desnecessárias, isso também para um tamanho máximo de 255 bytes. é claro que o varchar deve ser usado, o que não terá nenhuma das despesas gerais acima.
Ankan-Zerob
4
@ Ankan-Zerob Dado que parece muito claro que o TINYTEXT nunca deve ser usado sobre o VARCHAR, qual é a justificativa para tê-lo como opção? Existe algum caso de uso obscuro onde é necessário?
nextgentech 25/05
4
@nextgentech Veja dev.mysql.com/doc/refman/5.0/en/column-count-limit.html . Um tamanho de registro é limitado a 64 KiB. Uma tabela é limitada a 4k colunas. Um TINYTEXTconta 1 byte + 8 byte no tamanho do registro, enquanto um VARCHAR(255)conta de 1 byte + 255 byte até 2 byte + 1020 byte (caracteres UTF-8 de 4 bytes) no tamanho do registro.
Shi
2
Gosto de expressar tamanhos de campos em palavras, mas ... o inglês é normalmente considerado com cerca de 5 caracteres por palavra e também existe um caractere de espaço a ser armazenado; no entanto, o inglês sempre estará perto de 1 byte por caractere UTF-8, portanto, eu dividiria por 6, dando cerca de 40 / 10.000 / 2.700.000 / 710.000.000 palavras para os diferentes tamanhos. Idiomas com muitos sotaques, como o polonês, teriam um pouco menos de palavras; Grego, hebraico, árabe, etc (com seqüências principalmente de 2 bytes) cerca de metade; Os ideógrafos CJK são sequências de 3 ou 4 bytes, mas não sei quanto tempo as palavras têm.
ChrisV 29/02
44

Diante do desafio de @ Ankan-Zerob, esta é a minha estimativa do tamanho máximo que pode ser armazenado em cada tipo de texto medido em palavras :

      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

Em inglês , provavelmente 4,8 letras por palavra é provavelmente uma boa média (por exemplo, norvig.com/mayzner.html ), embora o tamanho das palavras varie de acordo com o domínio (por exemplo, idioma falado e trabalhos acadêmicos), portanto não faz sentido ser muito preciso. O inglês é principalmente caracteres ASCII de byte único, com caracteres de vários bytes muito ocasionais, tão próximos de um byte por letra. Um caractere extra deve ser permitido para espaços entre palavras, por isso arredondei para baixo de 5,8 bytes por palavra. Idiomas com muitos sotaques, como dizer polonês, armazenariam um pouco menos palavras, como faria, por exemplo, alemão com palavras mais longas.

Os idiomas que exigem caracteres de vários bytes , como grego, árabe, hebraico, hindi, tailandês, etc, etc, geralmente requerem dois bytes por caractere em UTF-8. Adivinhando descontroladamente 5 letras por palavra, reduzi de 11 bytes por palavra.

Scripts CJK (Hanzi, Kanji, Hiragana, Katakana, etc.) Não sei de nada; Acredito que os caracteres geralmente requerem 3 bytes em UTF-8 e (com simplificação maciça) eles podem ser considerados para usar cerca de 2 caracteres por palavra, portanto, eles estarão em algum lugar entre os outros dois. (Os scripts CJK provavelmente exigirão menos armazenamento usando UTF-16, dependendo).

Isso obviamente ignora as despesas gerais de armazenamento, etc.

ChrisV
fonte
Os caracteres CJK podem usar a sequência de 3 ou 4 bytes: dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
Raptor
8

Isso é legal, mas não responde à pergunta:

"Um VARCHAR sempre deve ser usado em vez de TINYTEXT." O texto minúsculo é útil se você tiver linhas largas - já que os dados são armazenados fora do registro. Há uma sobrecarga de desempenho, mas tem um uso.

colin0117
fonte