Array
(
)

Tipo de campo utilizar para armazenar textos

Felipe_cduarte
   - 17 ago 2004

Fala pessoal,

No Delphi temos o componente Memo, onde deixamos o usuario livre para digitar a quantidade de caracteres que ele desejar. A pergunta é a seguinte : qual campo utilizo no SQL Server para armazena-lo ? Seria o campo Text ? pq ele utiliza 16 bytes ( achei muito hehee ) ... Agradeço que puder me fornecer alternativas

[]´s

Marcus.magalhaes
   - 17 ago 2004

Felipe, bom dia.

Vc pode utilizar o tipo Text para armazenar grande quantidade de texto, se vc acha que será mto, pode utilizar o VarChar.

Ex.: Col1 VarChar(2000) NULL

Att,

Marcus.magalhaes
   - 17 ago 2004

Felipe,

Outra coisa mto importante, o tamanho do registro não pode ultrapassar o tamanho de 1 pagina (+/- 8000 bytes - por tem q descontar o tamanho do header da página).

Att,

Felipe_cduarte
   - 17 ago 2004

Fala Marcus blz ??

tenho uma duvida: o campo varchar(2000) , esse 2000 significa 2000 bytes ? pq se for fica maior ainda q o text (que sao 16 bytes) .. Estou certo ou estou fazendo confusão ? Ah , outra coisa .. vc disse que o registro nao pode ultrapassar 8000 bytes .. seriam estes 8000 bytes 8000 caracteres ?

[]´s

Marcus.magalhaes
   - 17 ago 2004

Oi Felipe, vamos lá, por partes.

Uma página equivale a 8 Kb, então vc pode, por conveniencia utilizar a relação 8000 bytes = 8000 caracteres, mas isso não é necessáriamente verdade, porque se vc define uma coluna nVarChar(3000) que irá armazenar 3000 caracteres, vc não está utilizando 3000 bytes, mas sim 6000 bytes, pq nVarChar é utilizado para caracteres UniCode, ou seja, ideogramas (linguas orientais), que usam 2 bytes para armazenar 1 caractere.

Uma coluna text usa 16 bytes na tabela, porém em disco poderá usar mto mais, pois na tabela é armazenado apenas o ponteiro para onde os dados realmente estão, portanto uma coluna do tipo Text poderá armazenar (2^31)-1 bytes (+/- 2,147,483,647 bytes / caracteres).
Apenas como referencia, se fosse uma coluna nText, esse valor seria (2^30) - 1 bytes (+/- 1,073,741,823 bytes / caracteres).

Então, voltando a questão original, se vc terá textos grandes, o ideal é criar a coluna como Text, mas se o texto não for tão grande vc pode utilizar o VarChar para isso.

Lembre : O VarChar ocupa físicamente somente a quantidade de bytes que foi utilizada, ou seja, não é pq vc criou um VarChar(2000) que ele irá usar 2000 bytes. Isso acontece com o tipo Char(), se vc cria uma coluna com Char(2000), não importa se vc ocupou apenas 100 posicões, físicamente ele irá ocupar 2000 bytes.

Aproveito para fazer um comentário : Quando vc estiver montando suas tabelas, colunas caractere (Char, VarChar) que tenham tamanhos pequenos, até 15 caracteres/bytes, eu costumo defini-las como CHAR, pois os gerenciadores de BD, irão perder tempo para determinar a posição final da coluna e o custo x benefício (tempo x espaço ocupado em disco) às vezes não vale a pena a economia.

Espero ter esclarecido suas dúvidas.

Att,

Felipe_cduarte
   - 17 ago 2004

Fala Marcus blz ??

Esse conceito de varchar/char pra mim é trankilo ... Eu utilizo char tb até uns 10 caracteres ou entao quando eu sei q o tamanho dos dados é fixo. Sobre o topico , eu levantei esta duvida por uma questao ´matematica´ , se é q podemos dizer assim. Vou me explicar :

Se eu criar uma coluna varchar(2000) e inserir um texto de 1000 caracteres eu vou gastar 1 kb certo ( seguindo a conveniencia de 1000 bytes = 1 kb ) ?

Entao a duvida é do campo Text: ele irá gastar 16 bytes somente ou 16 bytes + 1kb do texto digitado?

Voltando a questao ´performance´ qual o tipo de dado mais indicado ?

[]´s

Marcus.magalhaes
   - 17 ago 2004

Oi Felipe,

O campo text vai gastar 16 bytes na tabela + 16+1k no disco (16 bytes do ponteiro que será a referencia da tabela e 1k do texto).

Em termos de performance, será mais rápido se vc mantiver na tabela, pq vc irá fazer uma leitura a menos, pense da seguinte forma :

Se VarChar:
1 (Uma) Leitura para vc obter o resultado da tabela
Fim

Se Text :
1 (Uma) Leitura para vc obter o resultado da tabela
1 (Uma) Leitura para vc obter o text (pois a tabela tem é a referencia)
Fim

Isso a grosso modo, estamos desconsiderando a parte de leituras de páginas de índices, deslocamento da leitora do disco, para leitura da tabela + deslocamento da leitora de disco para o texto, etc.

Att,