TL;DR
TEXT
- tamanho máximo fixo de 65.535 caracteres (você não pode limitar o tamanho máximo)
- leva 2 +
c
bytes 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
M
caracteres M
precisa estar entre 1 e 65535- leva 1 +
c
bytes (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
.