Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Diferença entre VARCHAR e TEXT no MySQL

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, onde c é 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 (para M ≤ 255) ou 2 + c (para 256 ≤ M ≤ 65535) bytes de espaço em disco onde c é 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 .