Pergunta

varchar(255), varchar(256), nvarchar(255), nvarchar(256), nvarchar(máx), etc?

256 parece um número bonito, redondo e com uso eficiente de espaço.Mas já vi 255 muito usado.Por que?

Qual é a diferença entre varchar e nvarchar?

Foi útil?

Solução

VARCHAR(255).Ele não usará todos os 255 caracteres de armazenamento, apenas o armazenamento necessário.É 255 e não 256 porque você tem espaço para 255 mais o terminador nulo (ou byte de tamanho).

O "N" é para Unicode.Use se você espera caracteres não ASCII.

Outras dicas

No MS SQL Server (7.0 e superior), os dados varchar são representados internamente com até três valores:

  • A sequência real de caracteres, que será de 0 a algo acima de 8.000 bytes (é baseada no tamanho da página, nas outras colunas armazenadas para a linha e em alguns outros fatores)
  • Dois bytes usados ​​para indicar o comprimento da sequência de dados (que produz um valor de 0 a 8000+)
  • Se a coluna for anulável, um bit na máscara de bits nula da linha (para que o status nulo de até oito colunas anuláveis ​​possa ser representado em um byte)

A parte importante é aquele indicador de comprimento de dados de dois bytes.Se fosse um byte, você só poderia registrar corretamente strings de comprimento de 0 a 255;com dois bytes, você pode gravar strings de comprimento 0 a algo acima de 64.000+ (especificamente, 2 ^ 16 -1).No entanto, o comprimento da página do SQL Server é de 8k, de onde vem o limite de mais de 8.000 caracteres.(Há estouro de dados no SQL 2005, mas se suas strings forem tão longas, você deve usar varchar(max).)

Portanto, não importa quanto tempo você declare sua coluna de tipo de dados varchar (15, 127, 511), o que você realmente armazenará para cada linha é:

  • 2 bytes para indicar o comprimento da string
  • A string real, ou seja,o número de caracteres nessa string

O que me leva ao meu ponto:vários sistemas mais antigos usavam apenas 1 byte para armazenar o comprimento da string, e isso limitava você a um comprimento máximo de 255 caracteres, o que não é tão longo.Com 2 bytes, você não tem esse limite arbitrário...e por isso recomendo escolher um número que faça sentido para o usuário (supostamente não orientado tecnicamente)., gosto de 50, 100, 250, 500 e até 1000.Dada essa base de mais de 8.000 bytes de armazenamento, 255 ou 256 é tão eficiente quanto 200 ou 250, e menos eficiente quando chega a hora de explicar as coisas aos usuários finais.

Isso se aplica a dados de byte único (ou seja,ansii, SQL_Latin1*_*Geral_CP1, et.al.).Se você precisar armazenar dados para várias páginas de código ou idiomas usando alfabetos diferentes, precisará trabalhar com o tipo de dados nvarchar (que acho que funciona da mesma forma, dois bytes para o número de caracteres, mas cada caractere real dos dados requer dois bytes de armazenamento).Se você tiver strings com probabilidade de ultrapassar 8.000 ou mais de 4.000 em nvarchar, você precisará usar os tipos de dados [n]varchar(max).

E se você quiser saber por que é tão importante ocupar espaço com bytes extras apenas para rastrear o tamanho dos dados, dê uma olhada http://www.joelonsoftware.com/articles/fog0000000319.html

Philip

Há alguns outros pontos a serem considerados ao definir char/varchar e as N variações.

Primeiro, há alguma sobrecarga no armazenamento de strings de comprimento variável no banco de dados.Uma boa regra geral é usar CHAR para strings com menos de 10 caracteres, pois N/VARCHAR armazena a string e o comprimento e a diferença entre armazenar curto strings em N/CHAR vs.N/VARCHAR abaixo de 10 não vale a sobrecarga do comprimento da string.

Segundo, uma tabela no SQL Server é armazenada em páginas de 8 KB, portanto, o tamanho máximo da linha de dados é 8.060 bytes (os outros 192 são usados ​​para sobrecarga pelo SQL).É por isso que o SQL permite uma coluna máxima definida de VARCHAR(8000) e NVARCHAR(4000).Agora você pode use VARCHAR(MAX) e a versão unicode.Mas pode haver sobrecarga extra associada a isso.

Se não me engano, o SQL Server tentará armazenar os dados na mesma página que o restante da linha, mas, se você tentar colocar muitos dados em uma coluna VARCHAR(Max), ele os tratará como binários e armazene-o em outra página.

Outra grande diferença entre CHAR e VARCHAR tem a ver com a divisão de páginas.Dado que o SQL Server armazena dados em páginas de 8 KB, você pode ter qualquer número de linhas de dados armazenados em uma página.Se você ATUALIZAR uma coluna VARCHAR com um valor grande o suficiente para que a linha não caiba mais na página, o servidor irá dividir aquela página, movendo alguns registros.Se o banco de dados não tiver páginas disponíveis e estiver configurado para crescimento automático, o servidor primeiro aumentará o banco de dados para alocar páginas em branco para ele, depois alocará páginas em branco para a tabela e, finalmente, dividirá a página única em duas.

Se você oferecer suporte a outros idiomas além do inglês, você desejará usar o nvarchar.

HTML deve funcionar, desde que contenha caracteres ASCII padrão.Usei nvarchar principalmente em bancos de dados com suporte multilíngue.

Porque eles são 8 bits em 1 byte e assim em 1 byte você pode armazenar até 256 valores distintos, o que é

0 1 2 3 4 5 ... 255

Observe que o primeiro número é 0, então isso é um total de 256 números.

Então, se você usar nvarchar(255) Ele usará 1 byte para armazenar o comprimento da string, mas se você ultrapassar 1 e usar nvarchar(256), estará desperdiçando mais 1 byte apenas por aquele item extra de 255 (já que você precisa 2 bytes para armazenar o número 256).

Essa pode não ser a implementação real do SQL Server, mas acredito que seja o raciocínio típico para limitar as coisas em 255 em 256 itens.

e nvarchar é para Unicode, que usa mais de 2 bytes por caractere e
varchar é para texto ASCII normal que usa apenas 1 byte

IIRC, 255 é o tamanho máximo de um varchar no MySQL antes de você precisar mudar para o tipo de dados de texto, ou em algum momento (na verdade, acho que é maior agora).Portanto, mantê-lo em 255 pode garantir alguma compatibilidade.Você vai querer pesquisar isso antes de agir.

varchar vs nvarchar é como ascii vs unicode.varchar é limitado a um byte por caractere, nvarchar pode usar dois.É por isso que você pode ter um varchar(8000) mas apenas um nvarchar(4000)

Tanto varchar quanto nvarchar dimensionam automaticamente o conteúdo, mas o número que você define ao declarar o tipo de coluna é máximo.

Os valores em "nvarchar" ocupam o dobro do espaço em disco/memória que "varchar" porque o unicode tem dois bytes, mas quando você declara o tipo de coluna, você está declarando o número de caracteres, não de bytes.

Portanto, ao definir um tipo de coluna, você deve determinar o número máximo de caracteres que a coluna precisará conter e ter isso como o tamanho varchar (ou nvarchar).

Uma boa regra é estimar o comprimento máximo da coluna que a coluna precisa conter e, em seguida, adicionar suporte para cerca de 10% a mais de caracteres para evitar problemas com dados inesperadamente longos no futuro.

varchar(255) também era o comprimento máximo no SQL Server 7.0 e versões anteriores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top