Pergunta

Eu tenho dados de caracteres de comprimento variável e quer armazenar em SQL Server (2005) banco de dados. Eu quero aprender algumas das melhores práticas sobre como escolher TEXTO tipo SQL ou escolher VARCHAR SQL tipo, prós e contras na performance / footprint / função.

Foi útil?

Solução

Se você estiver usando SQL Server 2005 ou mais tarde, o uso varchar(MAX). O tipo de dados text é obsoleto e não deve ser usado para novos trabalhos de desenvolvimento. De os docs :

Importante

ntext , text e image tipos de dados será removido em uma versão futura do Microsoft SQL Server. Evitar o uso desses tipos de dados em novos trabalhos de desenvolvimento e planeje modificar os aplicativos que atualmente usam-los. Use nvarchar (max) , varchar (max) , e varbinary (max) .

Outras dicas

TEXT é usado para grandes peças de dados de cadeia. Se o comprimento do campo exceeed um certo limite, o texto é 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ê recebe 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)

Estas limitações de comprimento não dizem respeito VARCHAR(MAX) em SQL Server 2005 , que pode ser armazenado fora da linha, assim como TEXT.

Note que MAX não é um tipo de constante aqui, VARCHAR e VARCHAR(MAX) são muito diferentes tipos, sendo este último muito perto TEXT.

Em versões anteriores do SQL Server você não pode acessar o TEXT diretamente, você só poderia obter um TEXTPTR e usá-lo em funções READTEXT e WRITETEXT.

Em SQL Server 2005 você pode diretamente colunas acesso TEXT (embora você ainda precisa de uma conversão explícita para VARCHAR para atribuir um valor para eles).

TEXT é bom:

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

VARCHAR é bom:

  • Se você armazenar pequenas cordas
  • Se você procurar no valor da cadeia
  • Se você sempre selecioná-lo ou usá-lo na junta.

Por selecionando aqui eu quero dizer a emissão de quaisquer consultas que retornam o valor da coluna.

Por Pesquisar aqui eu quero dizer a emissão de quaisquer consultas cujo resultado depende do valor da coluna TEXT ou VARCHAR. Isto inclui a usá-lo em qualquer condição JOIN ou WHERE.

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

Alguns exemplos do que TEXT é bom para:

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

Alguns exemplos do que VARCHAR é bom para:

  • Nomes de usuários
  • Os títulos das páginas
  • Os nomes de arquivos

Como regra geral, se você precisar de você valor de texto para exceder 200 caracteres e Não use se juntar nessa coluna, o uso TEXT.

Caso contrário uso VARCHAR.

P.S. O mesmo se aplica a UNICODE habilitado NTEXT e NVARCHAR bem, o que você deve usar para exemplos acima.

P.P.S. O mesmo se aplica a VARCHAR(MAX) e NVARCHAR(MAX) que SQL Server 2005 + usa em vez de TEXT e NTEXT. Você precisa ativar large value types out of row para eles com sp_tableoption se você quer que eles sejam sempre armazenados fora da linha.

Como mencionado acima e aqui , TEXT vai ser preterido em versões futuras:

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

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

Além disso, varchar (max) é armazenado em (disco / memória) da tabela espaço, enquanto o tamanho está abaixo 8Kb. Somente quando você colocar mais dados no campo, é armazenada fora do espaço da tabela. Os dados armazenados no espaço da mesa é (geralmente) recuperou mais rápido.

Em suma, nunca use texto, como não há uma alternativa melhor: (n) varchar (max). E só usar varchar (max) quando um varchar regular não é grande o suficiente, ou seja, se você espera teh cadeia de caracteres que você está indo para loja vai exceder 8000 caracteres.

Como foi observado, você pode usar SUBSTRING sobre o tipo de dados de texto, mas apenas enquanto os campos de texto contém menos de 8000 caracteres.

Tem havido algumas mudanças importantes em ms 2008 -> Pode valer a pena considerar o seguinte artigo ao fazer uma decisão sobre que tipo de dados para uso. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Bytes por

  1. varchar (max), varbinary (max), xml, texto ou imagem coluna 2 ^ 31-1 2 ^ 31-1
  2. coluna
  3. nvarchar (máx) 2 ^ 30-1 2 ^ 30-1
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top