Tipo de texto do SQL Server vs. tipo de dados varchar [fechado]

287

Eu tenho dados de caracteres de tamanho variável e quero armazenar no banco de dados do SQL Server (2005). Quero aprender algumas práticas recomendadas sobre como escolher o tipo SQL TEXT ou escolher o tipo VARCHAR SQL, prós e contras em performance / pegada / função.

George2
fonte
17
Se o Google o enviou aqui: a página Tipos de dados SQL do MSDN pode ajudar.
Jeroen

Respostas:

212

Se você estiver usando o SQL Server 2005 ou posterior, use varchar(MAX). O texttipo de dados está obsoleto e não deve ser usado para novos trabalhos de desenvolvimento. Dos documentos :

Importante

ntext, text, E imagetipos de dados será removido em uma versão futura do Microsoft SQL Server. Evite usar esses tipos de dados em novos trabalhos de desenvolvimento e planeje modificar os aplicativos que os usam atualmente. Use nvarchar (max) , varchar (max) e varbinary (max) .

Mladen Prajdic
fonte
3
Obrigado Mladen, estou surpreso ao ver que o TEXT está obsoleto. Você tem algum documento oficial mencionando isso?
21413
1
Embora isso não seja "oficial", abrange o básico. De fato, o texto é depreciado e também não suporta tudo o que o varchar (max) faz, como a capacidade de pesquisar e indexar. blog.sqlauthority.com/2007/05/26/…
19/02/09
32
este é como offcial quanto ele ganha :) msdn.microsoft.com/en-us/library/ms187993.aspx
Mladen Prajdic
1
Cool achinda99 e Mladen Prajdic! O que você forneceu é o que estou procurando. :-) Mais uma pergunta, como escolhemos usar VARCHAR ou VARCHAR (MAX) em diferentes situações?
19420 George
1
Oficial Informação MS sobre isso é obsoleto: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda
283

TEXTé usado para grandes pedaços de dados de sequência. Se o comprimento do campo exceder um determinado limite, o texto será armazenado fora da linha.

VARCHARé sempre armazenado em linha e tem um limite de 8000 caracteres. Se você tentar criar um VARCHAR(x), onde x> 8000 , você receberá um erro:

Servidor: mensagem 131, nível 15, estado 3, linha 1

O tamanho () dado ao tipo 'varchar' excede o máximo permitido para qualquer tipo de dados (8000)

Essas limitações de comprimento não se referem VARCHAR(MAX)ao SQL Server 2005 , que pode ser armazenado fora de linha, assim como TEXT.

Observe que aqui MAXnão é um tipo de constante VARCHARe VARCHAR(MAX)são tipos muito diferentes, sendo o último muito próximo TEXT.

Nas versões anteriores do SQL Server, não era possível acessar TEXTdiretamente, você só podia obter um TEXTPTRe usá-lo em READTEXTe WRITETEXTfunções.

No SQL Server 2005, você pode acessar diretamente as TEXTcolunas (embora você ainda precise de uma conversão explícita VARCHARpara atribuir um valor a elas).

TEXT é bom:

  • Se você precisar armazenar textos grandes em seu banco de dados
  • Se você não pesquisar o valor da coluna
  • Se você selecionar esta coluna raramente e não participar dela.

VARCHAR é bom:

  • Se você armazenar pequenas cordas
  • Se você pesquisar no valor da sequência
  • Se você sempre selecioná-lo ou usá-lo em junções.

Ao selecionar aqui, quero dizer emitir qualquer consulta que retorne o valor da coluna.

Ao pesquisar aqui, quero dizer a emissão de quaisquer consultas cujo resultado depende do valor da coluna TEXTou VARCHAR. Isso inclui usá-lo em qualquer condição JOINou WHERE.

Como o TEXTé armazenado fora da linha, as consultas que não envolvem a TEXTcoluna geralmente são mais rápidas.

Alguns exemplos do que TEXTé bom para:

  • Comentários do blog
  • Páginas Wiki
  • Código fonte

Alguns exemplos do que VARCHARé bom para:

  • Nomes de usuário
  • Títulos da página
  • Nomes de arquivos

Como regra geral, se você precisar que seu valor de texto exceda 200 caracteres E não use junção nesta coluna, use TEXT.

Caso contrário, use VARCHAR.

PS O mesmo se aplica a UNICODEativado NTEXTe NVARCHARtambém, que você deve usar nos exemplos acima.

PPS O mesmo se aplica VARCHAR(MAX)e NVARCHAR(MAX)que o SQL Server 2005+ usa em vez de TEXTe NTEXT. Você precisará habilitá large value types out of row-los sp_tableoptionse quiser que eles sejam sempre armazenados fora da linha.

Como mencionado acima e aqui , TEXTisso será preterido em versões futuras:

A text in rowopção será removida em uma versão futura do SQL Server . Evite usar esta opção em novos trabalhos de desenvolvimento e planeje modificar os aplicativos que estão em uso no momento text in row. É recomendável que você armazenar grandes volumes de dados usando os varchar(max), nvarchar(max)ou varbinary(max)tipos de dados. Para controlar o comportamento em linha e fora de linha desses tipos de dados, use a large value types out of rowopção

Quassnoi
fonte
2
1. "Se você não pesquisar o valor da coluna" - poderia me mostrar o que você quer dizer com "pesquisar"? Você quer dizer selecionar esta coluna, ordenar esta coluna, COMO esta coluna ou usando alguma função de manipulação de string nesta coluna?
21413 George
2
2. "VARCHAR é sempre armazenado em linha e tem um limite de 8000 caracteres." - desculpe, eu não concordo com você. VARCHAR pode ser maior que 8000 e, se for maior que 8000, VARCHAR será armazenado além de colunas. Algum comentário?
19420 George
1
3. Mladen Prajdic mencionado neste tópico, o tipo TEXT está obsoleto, mas não encontro nenhum documento que cubra isso. Você tem algum documento para isso?
21420
2
Legal Quassnoi! Você é tão conhecedor! :-) Mais uma pergunta - "Isso, obviamente, não diz respeito ao VARCHAR (MAX), que é o SQL SERVER 2005, sinônimo de TEXT." "Isso" você quer dizer o que?
21413 George
"Isso obviamente não diz respeito ao VARCHAR (MAX), que é, para o SQL SERVER 2005, sinônimo de TEXT." - você tem algum documento que diga TEXT é o mesmo que VARCHAR no SQL Server 2005? Fiz algumas pesquisas, mas não consigo encontrar documentos oficiais. :-)
George2
41

No SQL Server 2005, novos tipos de dados foram introduzidos: varchar(max)e nvarchar(max) Eles têm as vantagens do tipo de texto antigo: eles podem conter 2 GB de dados, mas também têm a maioria das vantagens de varchare nvarchar. Entre essas vantagens estão a capacidade de usar funções de manipulação de strings, como substring ().

Além disso, varchar (max) é armazenado no espaço da tabela (disco / memória) enquanto o tamanho está abaixo de 8 KB. Somente quando você coloca mais dados no campo, eles são armazenados fora do espaço da tabela. Os dados armazenados no espaço da tabela são (geralmente) recuperados mais rapidamente.

Em resumo, nunca use Texto, pois existe uma alternativa melhor: (n) varchar (max). E use apenas varchar (max) quando um varchar regular não for grande o suficiente, ou seja, se você espera que a string que você armazenará excederá 8000 caracteres.

Como foi observado, você pode usar SUBSTRING no tipo de dados TEXT, mas apenas enquanto os campos TEXT contiverem menos de 8000 caracteres.

edosoft
fonte
1
Obrigado Edoode, você respondeu bastante como o VARCHAR é bom, mas algum comentário ou idéia sobre quando usar o VARCHAR e quando usar o TEXT? Minha pergunta é sobre como escolher 1 de 2 edições. :-)
George2
1
Na verdade, no MS SQL Server 2005, você pode usar SUBSTRING e outras funções nas colunas TEXT.
Quassnoi
1
Obrigado Quassnoi! Parece que o TEXT está obsoleto. Mais uma pergunta: como escolhemos usar VARCHAR ou VARCHAR (MAX) em diferentes situações?
19420 George
1
Só use varchar (max) quando um varchar regular não é grande o suficiente (8Kb deve ser suficiente para todos;)
edosoft
7

Houve algumas mudanças importantes no ms 2008 -> Pode valer a pena considerar o seguinte artigo ao tomar uma decisão sobre qual tipo de dados usar. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Bytes por

  1. coluna varchar (max), varbinary (max), xml, texto ou imagem 2 ^ 31-1 2 ^ 31-1
  2. coluna nvarchar (max) 2 ^ 30-1 2 ^ 30-1
Draz
fonte
3
Alterar? Essas capacidades não mudaram desde que os novos tipos de dados foram introduzidos.
Martin Smith