SQL - Varchar, Char, NVarchar, NChar e suas variantes MAX


Se você usa o banco de dados SQL Server em suas aplicações já notou a ampla gama de tipos de dados que ele oferece.

A seguir temos alguns tipos de dados do SQL Server para armazenamento de Strings:

ASCII Strings:

Tipos de dados Descrição
char(n) Sequência de caracteres de tamanho fixo. Máximo 8000 caracteres
varchar(n) Sequência de caracteres de tamanho variável. Máximo 8000 caracteres
varchar(max) Sequência de caracteres de tamanho variável. Máximo 1.073.741.824 caracteres
text Sequência de caracteres de tamanho variável. Máximo 2GB de dados de texto

Unicode strings:

Tipos de dados Descrição
nchar(n) Dados Unicode de comprimento fixo. Máximo 4000 caracteres
nvarchar(n) Dados Unicode de comprimento variável. Máximo 4000 caracteres
nvarchar(max) Dados Unicode de comprimento variável. Máximo 536.870.912 caracteres
ntext Dados Unicode de comprimento variável. Máximo 2GB de dados de texto

Essa ampla gama de tipos de dados no SQL Sever pode às vezes causar confusão no momento de decidir qual tipo de dados atribuir a um campo de uma tabela principalmente quando eles são parecidos.

Os tipos de dados VARCHAR, CHAR, NCHAR e NVARCHAR se enquadram nesta categoria e por serem muito usados e muito parecidos geralmente causam uma certa dúvida no momento de sua utilização. (Não vou tratar o tipo de dados text/ ntext)

Meu objetivo é tentar esclarecer as dúvidas a respeito das diferenças entre estes dois tipos de dados.

Então vamos lá...

Qual a diferença entre os esses tipos de dados ?

Qual a diferença entre VARCHAR e CHAR ???

CHAR e VARCHAR são tipos de dados caractere, a diferença é que CHAR é um tipo de dado de comprimento fixo e VARCHAR é de comprimento variável.

Usamos CHAR quando os tamanhos que desejamos armazenar na coluna de uma tabela são de tamanho consistentes e semelhantes. Exemplo: Número de telefone, CEP, CPF, CGC, etc. O tipo CHAR possui um tamanho fixo, assim se você tentar armazenar um valor maior que o definido numa coluna do tipo CHAR ele será truncado.

Se você definir uma coluna da tabela (campo) como CHAR(10) e armazenar um caractere apenas ele vai armazenar mais nove espaços em branco.( Por causa desta característica o tipo de dados CHAR é chamado de tipo de dados com tamanho fixo.)

Use VARCHAR quando os tamanhos a serem armazenados na coluna da tabela variam consideravelmente. Ex: Endereço,Nomes, URL, etc. Dessa forma um valor menor irá ocupar menos espaço que um valor maior.

O tipo de dados VARCHAR armazena somente a quantidade de caracteres que foram definidos na usa criação.

Assim se você definir uma coluna da tabela (campo) como VARCHAR(10) e armazenar um caractere ele vai armazenar somente o caractere sem colocar espaços para completar o tamanho definido na criação.

Quando usar CHAR ou VARCHAR ?

O tipo CHAR deve ser usado quando sabemos que todos os dados armazenados em determinada coluna não são variáveis como, por exemplo, uma coluna que armazena a sigla do estado ou o cep que sempre terão o mesmo tamanho.

Já o VARCHAR deve ser utilizado quando não sabemos o que vamos armazenar. Um exemplo pode ser o nome do cliente, endereço, o email que sempre variam de tamanho.

Qual a diferença entre NVARCHAR E NCHAR ?

NCHAR e NVARCHAR são semelhantes a CHAR e VARCHAR a diferença é que eles armazenam dados no formato Unicode e utilizam para isso a representação de 1 byte para cada caractere usando assim uma representação de 16 bits.

Qual a diferença entre VARCHAR e NVARCHAR ???

VARCHAR é uma abreviação para
VARiable-length CHARacter string que é uma sequência de caracateres de texto que pode ser tão grande quanto o tamanho da página para a tabela de banco de dados da coluna em questão.

O tipo de dados VARCHAR armazenam os dados em ASCII e utilizam 1 byte ou 8 bits para representar um caractere.

O tamanho de uma página de tabela é 8196 bytes, e não uma linha em uma tabela pode ser superior a 8.060 caracteres. Este, por sua vez, limita o tamanho máximo de um VARCHAR para 8.000 bytes.

E o tipo de dados NVARCHAR ?

Bem, o N(VARCHAR) significa uNicode e essencialmente , NVARCHAR nada mais é do que um VARCHAR que suporta Unicode ou seja que usa dois bytes para representar um caractere.

O tipo de dados NVARCHAR armazenam os dados em Unicode e utilizam 2 bytes ou 16 bits para representar um caractere.

Um uso mais comum para esse tipo de de dados e quando você deseja armazenar caracteres de idiomas que exigem mais de u m byte para representar um caractere.

Assim quando você define uma coluna como sendo VARCHAR(30) terá 30 bytes alocados para a coluna. Se você usar o tipo NVARCHAR(30) terá 60 bytes alocados.

Portanto o tamanho máximo para o tipo de dados VARCHAR (e CHAR) é 8000 bytes e para o tipo de dados NVARCHAR (e NCHAR) é 4000 bytes.

A partir da versão SQL Server 2005 introduziu um novo tipo de dados , o tipo de dados XML que permite armazenar documentos XML em um banco de dados SQL Server.

Para suportar o novo tipo de dados foram introduzidos também 3 novos tipos de dados diferentes: VARCHAR(MAX), NVARCHAR(MAX) E VARBINARY(MAX)

A utilização de MAX indica que esses tipos de dados podem armazenar um valor superior aos seus respectivos limites: 8000 e 4000 bytes.

VARCHAR (MAX) - indica que o tamanho máximo de armazenamento para o tipo de dados VARCHAR é 2^31 bytes ( 2 GB)
NVARCHAR (MAX) - indica que o tamanho máximo de armazenamento para NVARCHAR o tipo de dados é
2^31 bytes ( 2 GB)
VARBINARY (MAX) - indica que o tamanho máximo de armazenamento para o tipo de dados VARBINARY é
2^31 bytes ( 2 GB)


Quando usar VARCHAR ou NVARCHAR ?

Depende ???

Poderíamos usar duas linhas de pensamento:

  • Usar VARCHAR a menos que precisamos lidar com uma grande quantidade de dados internacionalizados, neste caso use NVARCHAR;
  • ou

    Se você tem sites que oferecem suporte a vários idiomas, considere usar os tipos de dados que dão suporte a Unicode como NCHAR ou NVARCHAR para minimizar os problemas de conversão de caracteres.

    Se sua aplicação nunca vai precisar tratar textos multilíngues ou lidar com dados internacionalizados você pode usar VARCHAR e assim terá o máximo de 8000 bytes a sua disposição mas se um dia você precisar migrar o tipo de dados o 'bicho vai pegar...'

    Lembre que se você usar NVARCHAR para tudo terá a sua disposição somente 4000 bytes no tipo de dados atribuído. (A menos que use MAX).

    Existe um detalhe importante quando você usa NVARCHAR OU VARCHAR : os campos NVarchar não sofrem influência do Collation e o Varchar sofre.

    Obs: A Collation refere-se ao conjunto de caracteres usado para armazenar dados em campos de texto sendo necessária para fornecer suporte para os muitos idiomas que podem ser usados.

    Quando usamos CHAR ou VARCHAR as colunas são atribuídas a Collation padrão do banco de dados a menos que uma collation específico seja atribuído usando a cláusula COLLATE.

    A incorreta definição da Collation quando você usar VARCHAR, vai afetar muitos caracteres, e , assim alguns registros que contenham por exemplo a palavra "ausência" será mostrado como "aus?ncia" , ou seja, caracteres acentuados não serão representados corretamente.

    Eu sei é apenas SQL , mas eu gosto...

    Referências:

    José Carlos Macoratti