Pergunta

O que se entende por nvarchar?

O que é a diferença entre char, nchar, varchar e nvarchar no SQL Server?

Foi útil?

Solução

Só para esclarecer ... ou resumir ...

  • nchar e nvarchar pode armazenar Unicode caracteres.
  • char e varchar não pode armazenar Unicode caracteres.
  • char e nchar são de comprimento fixo que reserva de espaço de armazenamento para o número de caracteres que você especificar ainda se você não usar todo esse espaço.
  • varchar e nvarchar são de comprimento variável que só vai usar os espaços para os personagens que você armazena. É irá armazenamento não reserva como char ou nchar .

nchar e nvarchar vai ocupar o dobro de espaço de armazenamento, por isso pode ser sábio para usá-los somente se você precisa de Unicode apoio.

Outras dicas

Todas as respostas até agora indicam que varchar é único byte, nvarchar é duplo byte. A primeira parte deste realmente depende agrupamento como ilustrado abaixo.

DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE  Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)

INSERT INTO @T 
    VALUES (N'中华人民共和国',N'中华人民共和国'),
           (N'abc',N'abc');

SELECT C1,
       C2,
       LEN(C1)        AS [LEN(C1)],
       DATALENGTH(C1) AS [DATALENGTH(C1)],
       LEN(C2)        AS [LEN(C2)],
       DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM   @T  

Retorna

 enter descrição da imagem aqui

Note que os personagens e ainda não estavam representados na versão VARCHAR e foram silenciosamente substituídos por ?.

Na verdade, existem ainda caracteres não chinesas que podem ser reprsented por um único byte em que agrupamento. O único single caracteres de bytes são o típico conjunto ASCII ocidental.

Devido a isso é possível para uma inserção de uma coluna nvarchar(X) a uma coluna varchar(X) a falhar com um erro de truncamento (onde X denota um número que é o mesmo em ambos os casos).

SQL Server 2012 adiciona SC (Character Suplementar) agrupamentos que UTF-16 apoio. Nestes agrupamentos um único caractere nvarchar pode demorar 2 ou 4 bytes.

nchar e carvão praticamente funcionam exactamente da mesma forma que os outros, assim como nvarchar e varchar. A única diferença entre eles é que nchar / nvarchar armazenar Unicode caracteres (essencial se você exigir o uso de conjuntos de caracteres estendidos), enquanto varchar não.

Porque caracteres Unicode exigem mais espaço de armazenamento, nchar / campos nvarchar levar até duas vezes mais espaço (assim, por exemplo em versões anteriores do SQL Server o tamanho máximo de um campo nvarchar é de 4000).

Esta questão é uma duplicata de esta .

Só para acrescentar algo mais: nchar - adiciona espaços à direita para os dados. nvarchar -. Não adiciona espaços à direita para os dados

Então, se você estiver indo para filtrar o conjunto de dados por um campo 'nchar', você pode querer usar RTRIM para remover os espaços. Por exemplo. nchar (10) campo chamado lojas da marca a palavra NIKE. Ele acrescenta 6 espaços à direita da palavra. Então, quando a filtragem, a expressão deve ler: RTRIM (Fields! BRAND.Value) = "NIKE"

Espero que isso ajude alguém lá fora, porque eu estava lutando com ele para um pouco agora!

A minha tentativa de resumir e corrigir as respostas existentes:

Em primeiro lugar, char e nchar sempre usará uma quantidade fixa de espaço de armazenamento, mesmo quando a corda a ser armazenado é menor do que o espaço disponível, enquanto varchar e nvarchar vai usar apenas a quantidade de espaço de armazenamento como é necessário para armazenar essa string (mais dois bytes de sobrecarga, presumivelmente para armazenar o comprimento de cadeia). Então lembre-se, "var" significa "variável", como no espaço variável.

O segundo ponto importante a entender é que, nchar e nvarchar loja cordas usando exatamente dois bytes por caractere, enquanto char e uso varchar uma codificação determinada pela página de código de agrupamento, que irá geralmente ser exatamente um byte por caractere (embora haja exceções, veja abaixo). Ao usar dois bytes por caractere, uma gama muito ampla de caracteres podem ser armazenados, assim que a primeira coisa a lembrar aqui é que nchar e nvarchar tendem a ser a melhor escolha muito quando você quer apoio à internacionalização, que você provavelmente fazer.

Agora, para algumas alguns pontos mais delicados.

colunas

Primeiro, nchar e nvarchar sempre armazenar dados usando UCS-2. Isso significa que exatamente dois bytes por caractere será usado, e qualquer caractere Unicode no Basic Multilingual Plane (BMP) podem ser armazenados por um campo nchar ou nvarchar. No entanto, não é o caso que qualquer de caracteres Unicode podem ser armazenados. Por exemplo, de acordo com a Wikipedia, os pontos de código para hieróglifos egípcios estão fora do BMP. Há, portanto, cadeias de caracteres Unicode que podem ser representados em outras verdadeiras codificações Unicode que não podem ser armazenados em um nchar ou nvarchar campo SQL Server UTF-8 e e cordas escritos em hieróglifos egípcios estaria entre eles. Felizmente seus usuários provavelmente não escrever nesse roteiro, mas é algo a ter em mente!

Outro ponto confuso, mas interessante que outros cartazes têm destacado é que char e varchar campos podem usar dois bytes por caractere para determinados caracteres, se a página de código de agrupamento exige. (Martin Smith dá um excelente exemplo no qual ele mostra como Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS exibe este comportamento. Check it out.)

UPDATE: a partir de SQL Server 2012, há finalmente páginas para UTF-16 , por exemplo Latin1_General_100_CI_AS_SC, que pode realmente cobrem toda a gama Unicode.

  • char: dados de caracteres de comprimento fixo com um comprimento máximo de 8000 caracteres
  • .
  • nchar: dados Unicode de comprimento fixo com um comprimento máximo de caracteres 4000
  • .
  • Char = 8 comprimento de bits
  • NChar = 16 comprimento de bits

nchar[(n)] (caráter nacional)

  • Fixed-length Unicode dados de cadeia.
  • n define o comprimento da corda e deve ser um valor entre 1 e 4.000.
  • O tamanho de armazenamento é duas vezes n bytes.

nvarchar [(n | max)] (variando caráter nacional.)

  • de tamanho variável Unicode de dados de cadeia.
  • n define o comprimento da corda e pode ser um valor de 1 a 4.000.
  • max indica que o tamanho máximo de armazenamento é de 2 ^ 31-1 bytes (2 GB).
  • O tamanho de armazenamento, em bytes, é duas vezes o comprimento real dos dados introduzidos + 2 bytes

char [(n)] (personagem)

  • Fixed-length, dados de cadeia non-Unicode.
  • n define o comprimento da corda e deve ser um valor de 1 a 8.000.
  • O tamanho de armazenamento é bytes n.

varchar [(n | max)] (variando de caracteres)

  • Variable-length, não-Unicode dados de cadeia.
  • n define o comprimento da corda e pode ser um valor de 1 a 8.000.
  • max indica que o tamanho máximo de armazenamento é de 2 ^ 31-1 bytes (2 GB).
  • O tamanho de armazenamento é o comprimento real dos dados inseridos + 2 bytes.

As diferenças são:

  1. n [var] lojas de char unicode enquanto [var] caractere apenas armazena caracteres de byte único.
  2. [n] de char requer um número fixo de caracteres do comprimento exacto enquanto que [n] VARCHAR aceita um número variável de caracteres até e incluindo o comprimento definido.

Outra diferença é o comprimento. Ambos nchar e nvarchar pode ser de até 4.000 caracteres. E CHAR e VARCHAR pode ser de até 8000 caracteres. Mas para SQL Server, você também pode usar uma [n] varchar (max), que pode suportar até 2,147,483,648 caracteres. (Dois gigabytes, um assinado inteiro de 4 bytes).

nchar requer mais espaço do que nvarchar.

por exemplo,

Um char (100) sempre armazenar 100 caracteres mesmo se você só entra 5, o remanescente 95 caracteres serão preenchidos com espaços. Armazenando 5 caracteres em um varchar (100) vai economizar 5 caracteres.

nchar (10) é uma seqüência de caracteres Unicode de comprimento fixo de comprimento 10. nvarchar (10) é uma seqüência de caracteres Unicode de comprimento variável com um comprimento máximo de 10. Normalmente, você usaria o ex-se todos os valores de dados são 10 caracteres e o último caso os comprimentos variar.

  • nchar é fixo de comprimento e pode conter caracteres Unicode. ele usa dois bytes de armazenamento por personagem.

  • varchar é de comprimento variável e não pode conter caracteres Unicode. ele usa o armazenamento de um byte por caractere.

NVARCHAR pode armazenar caracteres Unicode e leva 2 bytes por caractere.

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