Existe algum motivo para usar varchar sobre colunas de texto em um banco de dados?

36

É varcharapenas um remanescente de antes textveio ao redor, ou existem casos de uso onde você iria querer usar um varchar? (Ou, charnesse caso ..)

(Eu uso Postgres e MySQL (MyISAM) diariamente, então é nisso que eu mais me interesso, mas as respostas para outros bancos de dados são obviamente bem-vindas. ^ _-)

Izkata
fonte
6
Pelo menos para o SQL Server , textestá obsoleto. Há também considerações de uso relacionadas a onde os dados são armazenados e como, portanto, são acessados.
Oded
Em alguns DBMSs, talvez você não consiga usar uma coluna de texto em uma cláusula de classificação ou de onde. Não estou familiarizado com o Postgres, mas verifique sua documentação.
JQA
11
Esta questão StackOverflow pode fornecer mais algumas informações.
J0ANMM

Respostas:

32

Em geral

textcolunas não são padrão e são específicas da implementação. Em muitos casos, dependendo do banco de dados, eles podem ter uma combinação de uma ou mais das seguintes restrições: não indexável , não pesquisável e não classificável .

No Postgres

Todos esses tipos são salvos internamente usando a mesma estrutura de dados C. .

No MySQL

A textcoluna é uma versão especializadaBLOB e tem restrições na indexação.

Apenas esses dois exemplos podem ser extrapolados para outros sistemas SQL RDBMS e devem ser motivos suficientes para entender quando escolher um tipo em relação ao outro.

Apenas para deixar implicitamente claro, você nunca deve usá- TEXTlo, pois é proprietário e não padrão. Qualquer coisa que SQLvocê escrever contra ele não será portátil e certamente causará problemas no futuro. Use apenas tipos que fazem parte do padrão ANSI .

  • Use CHARquando souber que possui um número fixo de caracteres para cada entrada.
  • Use VARCHARquando você tiver um número variável de caracteres para cada entrada.
  • Se você precisar de mais armazenamento do que o VARCHARfornecido, CLOBcom UTF-8codificação ou tipo padrão equivalente.
  • NUNCA use, TEXTpois não é padrão.

fonte
11
Aceitei non standard and implementation specifice not indexable, not searchable and not sortable, o que eu não percebi. Eu estava com a impressão de que text era padronizada.
Izkata
11
você quer dizer o textpadrão ASCII ou UNICODE text:-) ou uma das outras meia dúzia de textpadrões de codificação?
11
se você pesquisar nos documentos dos padrões SQL, acho que não encontrará nada textcomo um tipo de caractere. Eu não vi nada, alguns fornecedores chamam long chare assim por diante, é basicamente um BLOB com uma codificação anexada a ele.
2
@JarrodRoberson, para ser sincero, existem muitos recursos respeitáveis ​​que concluem (quando no ambiente do Postgres) que "sempre usam TEXT". Se você estiver migrando para um banco de dados diferente, isso dificilmente prejudicará o negócio, especialmente porque você precisará considerar que o postgres é ilimitado VARCHAR(devido ao TOAST, não há limite de linhas, como no MySQL, por exemplo) pode não se traduzir em ilimitado VARCHARno outros bancos de dados de qualquer maneira.
Kayaman 11/06
11
... e como o Postgres não suporta CLOB , o penúltimo ponto não é válido. Você nunca será capaz de oferecer suporte a substituições drop-in, mesmo seguindo a norma. Assim como escrever ANSI SQL não é uma opção viável no mundo real, a menos que você esteja escrevendo SQL de brinquedo.
Kayaman 11/06
11

text, varchare chartodos são usados ​​por diferentes motivos. É claro que existem diferenças de implementação (quanto tamanho elas ocupam ... etc), mas também existem considerações de uso e intenção . O tipo que você usa também informa sobre o tipo de dados que serão armazenados nele (ou todos nós usaríamos textpara tudo ). Se algo tem um comprimento fixo, usamos char. Se ele tiver comprimento variável com um limite superior bem definido, use varchar. Se é um pedaço grande de texto que você tem pouco controle, textprovavelmente seria sua melhor aposta.

Sistema caiu
fonte
3
Então, a única diferença real é duplicar a verificação de limites que provavelmente deveria estar no código do programa, afinal?
Izkata 10/07/12
2
@ Izkata - Existem diferenças de implementação também. Não se trata de verificação de limites, é de tipo de dados . Um CEP (EUA) é sempre um código de 5 dígitos, portanto, usar algo como 'char' torna-se parte da definição desse conjunto de dados. Se fosse apenas algo como verificação vinculada, todos nós poderíamos usar apenas um tipo de dados para tudo e fazer o nosso lado do código de verificação e conversão.
System Down
6
@SystemDown Tanto quanto eu sei, char, varchar, e textsão todos concebidos para armazenar o mesmo tipo de dados. Portanto, as duas respostas aqui são sobre verificação de limites. Se houver diferenças de eficiência, quais são elas? Por que eu iria usar varcharmais text?
Izkata 10/07/12
11
float e double também são usados ​​para o mesmo tipo de dados, mas eles têm diferenças e são usados ​​de maneira diferente. Quanto às diferenças de implementação, não estou familiarizado o suficiente com o Postgres para responder que tenho medo.
System Down
4
@ SystemDown Embora o armazenamento de códigos postais como um caractere (5) possa morder você, se você começar a internacionalizar. Os códigos postais do Reino Unido variam em tamanho e 5 caracteres quase nunca são suficientes. Porém, não sei se o espaço em um código postal do Reino Unido é relevante para a análise.
Vatine 5/08
5

Os bancos de dados estão intensamente preocupados com o desempenho - velocidade e minimização do armazenamento. Na maioria das outras partes do mundo dos computadores, você não se incomodará com quantos caracteres há na sua cadeia de caracteres; poderia ser um, poderia ser todo o conteúdo de uma enciclopédia; é tudo apenas uma corda. De fato, muitos idiomas nem mesmo o incomodam, seja uma string ou um número.

Porém, à medida que os computadores ficam mais rápidos e ganham mais memória, as pessoas colocam mais dados em seus bancos de dados e fazem consultas mais sofisticadas. Para um banco de dados, a CPU e a memória são hoje tão limitantes quanto nos dias de memória principal de 64Kb e discos rígidos de 10Mb (em computadores mainframe ).

Um número fixo de bytes é muito mais fácil de lidar do que um número de tamanho variável. 10 bytes é muito mais fácil de lidar do que 1.000.000. Portanto, seu banco de dados deseja que você dê uma pista para fornecer um gigabyte de resultados de terrabytes de dados em microssegundos. Se você não estiver usando seu banco de dados com tanta força, não precisará da velocidade que ele oferece e ficará aborrecido com as perguntas desnecessárias. Mas se você precisar do desempenho, ficará feliz em lhe dar algumas dicas.

Conforme observado nas outras respostas, use charse ele sempre usar um certo número de caracteres, varcharse o comprimento puder variar, mas não for muito grande (meu palpite é que a maioria dos DBs o trata como um charou textdependendo do tamanho) e textse pode ter qualquer comprimento. Se suas tentativas SQL para usar uma textcoluna, pode ser melhor para resumi-lo de alguma forma, e colocá-lo em um charou pequena varcharcoluna também, em seguida, fazer where's e order byé sobre isso. Claro, isso é apenas se o desempenho é importante para você.

RalphChapin
fonte