TL;DR
TEXT - tamanho máximo fixo de 65.535 caracteres (você não pode limitar o tamanho máximo)
- leva 2 +
cbytes de espaço em disco, ondecé o comprimento da string armazenada. - não pode ser (totalmente) parte de um índice. Seria necessário especificar um comprimento de prefixo.
VARCHAR(M) - tamanho máximo da variável de
Mcaracteres Mprecisa estar entre 1 e 65535- leva 1 +
cbytes (paraM≤ 255) ou 2 +c(para 256 ≤M≤ 65535) bytes de espaço em disco ondecé o comprimento da string armazenada - pode fazer parte de um índice
Mais detalhes
TEXT tem um fixo tamanho máximo de 2¹⁶-1 = 65535 caracteres.VARCHAR tem uma variável tamanho máximo M até M = 2¹⁶-1 .Então você não pode escolher o tamanho de
TEXT mas você pode para um VARCHAR . A outra diferença é que você não pode colocar um índice (exceto um índice de texto completo) em um
TEXT column.Então, se você quiser ter um índice na coluna, você deve usar
VARCHAR . Mas observe que o comprimento de um índice também é limitado, portanto, se seu VARCHAR coluna é muito longa você tem que usar apenas os primeiros caracteres do VARCHAR coluna em seu índice (consulte a documentação para CREATE INDEX
). Mas você também quer usar
VARCHAR , se você souber que o comprimento máximo da string de entrada possível é apenas M , por exemplo. um número de telefone ou um nome ou algo assim. Então você pode usar VARCHAR(30) em vez de TINYTEXT ou TEXT e se alguém tentar salvar o texto de todos os três livros "Lord of the Ring" na sua coluna de número de telefone, você armazenará apenas os primeiros 30 caracteres :) Editar: Se o texto que você deseja armazenar no banco de dados tiver mais de 65.535 caracteres, você deve escolher
MEDIUMTEXT ou LONGTEXT , mas tenha cuidado:MEDIUMTEXT armazena strings de até 16 MB, LONGTEXT até 4GB. Se você usar LONGTEXT e obtenha os dados via PHP (pelo menos se você usar mysqli sem store_result ), você pode receber um erro de alocação de memória, porque o PHP tenta alocar 4 GB de memória para garantir que toda a string possa ser armazenada em buffer. Isso talvez também aconteça em outras linguagens além do PHP. No entanto, você deve sempre verifique a entrada (é muito longa? Contém código estranho?) antes armazenando-o no banco de dados.
Aviso:para ambos os tipos, o espaço em disco necessário depende apenas do comprimento da string armazenada e não do comprimento máximo.
Por exemplo, se você usar o charset latin1 e armazenar o texto "Test" em
VARCHAR(30) , VARCHAR(100) e TINYTEXT , ele sempre requer 5 bytes (1 byte para armazenar o comprimento da string e 1 byte para cada caractere). Se você armazenar o mesmo texto em um VARCHAR(2000) ou um TEXT coluna, também exigiria o mesmo espaço, mas, neste caso, seriam 6 bytes (2 bytes para armazenar o comprimento da string e 1 byte para cada caractere). Para obter mais informações, consulte a documentação .
Finalmente, quero adicionar um aviso, que ambos,
TEXT e VARCHAR são tipos de dados de comprimento variável e, portanto, provavelmente minimizam o espaço necessário para armazenar os dados. Mas isso vem com um trade-off para o desempenho. Se você precisa de um melhor desempenho, você deve usar um tipo de comprimento fixo como CHAR . Você pode ler mais sobre isso aqui
.