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




text and longtext (4)

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

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

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


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

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


Da documentation :

      Type | Maximum length
-----------+-------------------------------------
  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

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


Subindo para o desafio do @Ankan-Zerob, esta é a minha estimativa do comprimento 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 , 4,8 letras por palavra é provavelmente uma boa média (por exemplo, norvig.com/mayzner.html ), embora as extensões de palavras variem de acordo com o domínio (por exemplo, linguagem falada versus trabalhos acadêmicos), então não faz sentido ser muito preciso. O inglês é principalmente caracteres ASCII de byte único, com caracteres multibyte muito ocasionais, tão próximos de um byte por letra. Um caractere extra deve ser permitido para espaços entre palavras, então arredondamos para baixo de 5,8 bytes por palavra. Idiomas com muitos acentos, como o polonês, armazenam um pouco menos palavras, como, por exemplo, o alemão com palavras mais longas.

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

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

Isto é claro, ignorando sobrecargas de armazenamento etc.


Expansão da mesma resposta

  1. Este post SO: varchar (255) vs tinytext / tinyblob e varchar (65535) vs blob / text descreve detalhadamente os overheads e mecanismos de armazenamento.
  2. Como observado no ponto (1), um VARCHAR sempre deve ser usado em vez de TINYTEXT. No entanto, ao usar VARCHAR, o tamanho de linha máximo não deve exceder 65535 bytes.
  3. Como descrito aqui http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html , max 3 bytes para utf-8.

ESTA É UMA TABELA DE ESTIMAÇÃO ÁSPERA PARA DECISÕES RÁPIDAS!

  1. Então as suposições de pior caso (3 bytes por utf-8 char) para o melhor caso (1 byte por utf-8 char)
  2. Assumindo que a língua inglesa 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 |           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

Por favor, consulte a resposta de Chris V também: https://.com/a/35785869/1881812







innodb