O que se entende por nvarchar?
Qual é a diferença entre char, nchar, varchar, e nvarcharno SQL Server?
O que se entende por nvarchar?
Qual é a diferença entre char, nchar, varchar, e nvarcharno SQL Server?
Respostas:
Apenas para esclarecer ... ou resumir ...
nchare nvarcharpode armazenar caracteres Unicode .chare não pode armazenar caracteres Unicode .varchar chare ncharsão de comprimento fixo, que reservam espaço de armazenamento para o número de caracteres que você especificar, mesmo se você não usar todo esse espaço.varchare nvarcharsão de tamanho variável, que só ocupam espaços para os caracteres que você armazena. Não reservará armazenamento como charounchar .nchare nvarcharocupará o dobro do espaço de armazenamento; portanto, é aconselhável usá-los apenas se você precisar de suporte Unicode .
n...versões levar até duas vezes mais espaço de armazenamento como minha resposta mostra
Todas as respostas até agora indicam que varcharé um byte único, nvarchar é um byte duplo. A primeira parte disso realmente depende da intercalação, 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
Devoluções
Observe que os caracteres 华e 国ainda não foram representados na VARCHARversão e foram substituídos silenciosamente por ?.
Na verdade, ainda não existem caracteres chineses que possam ser reprocessados por um único byte nesse agrupamento. Os únicos caracteres de byte único são o conjunto ASCII ocidental típico.
Por esse motivo, é possível inserir um nvarchar(X) coluna em uma varchar(X)coluna falhe com um erro de truncamento (onde X indica um número igual nas duas instâncias).
O SQL Server 2012 adiciona agrupamentos de SC (caracteres suplementares) compatíveis UTF-16. Nesses agrupamentos, um único nvarcharcaractere pode levar 2 ou 4 bytes.
nchar e char funcionam praticamente da mesma maneira que os outros, assim como nvarchar e varchar. A única diferença entre eles é que o nchar / nvarchar armazena caracteres Unicode (essencial se você precisar do uso de conjuntos de caracteres estendidos), enquanto o varchar não.
Como os caracteres Unicode requerem mais armazenamento, os campos nchar / nvarchar ocupam o dobro do espaço (por exemplo, nas versões anteriores do SQL Server, o tamanho máximo de um campo nvarchar é 4000).
Esta pergunta é uma duplicata desta .
Apenas para adicionar algo mais: nchar - adiciona espaços finais aos dados. nvarchar - não adiciona espaços finais aos dados.
Portanto, se você deseja filtrar seu conjunto de dados por um campo 'nchar', convém usar o RTRIM para remover os espaços. Por exemplo, o campo nchar (10) chamado BRAND armazena a palavra NIKE. Adiciona 6 espaços à direita da palavra. Portanto, ao filtrar, a expressão deve ser: RTRIM (Fields! BRAND.Value) = "NIKE"
Espero que isso ajude alguém lá fora, porque eu estava lutando com isso um pouco agora!
Minha tentativa de resumir e corrigir as respostas existentes:
Em primeiro lugar, chare ncharsempre 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 que varcharenvarchar vai utilizar apenas a quantidade de espaço de armazenamento, como é necessário para armazenar essa cadeia (mais dois bytes de sobrecarga, presumivelmente para armazenar o comprimento da corda). Então lembre-se, "var" significa "variável", como no espaço variável.
O segundo ponto importante a entender é que, nchare nvarchararmazene seqüências de caracteres usando exatamente dois bytes por caractere, chare varcharuse uma codificação determinada pela página de códigos de intercalação, que geralmente será exatamente um byte por caractere (embora haja exceções, veja abaixo). Ao usar dois bytes por caractere, uma variedade muito ampla de caracteres pode ser armazenada; portanto, o básico a ser lembrado aqui é esse nchare nvarchartende a ser uma escolha muito melhor quando você deseja suporte à internacionalização, o que provavelmente o faz.
Agora, alguns pontos mais delicados.
Em primeiro lugar, nchare nvarcharcolunas sempre armazenar dados usando UCS-2. Isso significa que exatamente dois bytes por caractere serão usados e qualquer caractere Unicode no BMP (Basic Multilingual Plane) pode ser armazenado por um campo ncharou nvarchar. No entanto, não é possível que qualquer caractere Unicode possa ser armazenado. Por exemplo, de acordo com a Wikipedia, os pontos de código para hieróglifos egípcios ficam fora do BMP. Portanto, existem cadeias Unicode que podem ser representadas em UTF-8 e outras codificações Unicode verdadeiras que não podem ser armazenadas em um SQL Server ncharou nvarcharcampo, e as cadeias escritas em hieróglifos egípcios estariam entre elas. Felizmente, seus usuários provavelmente não escrevem nesse script, mas é algo a ter em mente!
Outro ponto confuso, mas interessante, que outros pôsteres destacaram é que os campos chare varcharpodem usar dois bytes por caractere para determinados caracteres, se a página de código de intercalação exigir. (Martin Smith dá um excelente exemplo no qual ele mostra como Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS exibe esse comportamento. Confira.)
ATUALIZAÇÃO: A partir do SQL Server 2012, finalmente existem páginas de código para UTF-16 , por exemplo, Latin1_General_100_CI_AS_SC, que pode realmente cobrir todo o intervalo 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 4000 caracteres.Char = Comprimento de 8 bitsNChar = Comprimento de 16 bitscharnão poderia ter um comprimento de 8 bits. Não é necessário armazenar o comprimento, e o comprimento fixo pode ter até 8000 caracteres.
nchar[(n)] (figura nacional)
n define o comprimento da sequência e deve ser um valor de 1 a 4.000.nbytes.nvarchar [(n | max)] (caráter nacional variando.)
n define o comprimento da string e pode ser um valor de 1 a 4.000.max indica que o tamanho máximo de armazenamento é 2 ^ 31-1 bytes (2 GB).char [(n)] (personagem)
non-UnicodeDados de string de comprimento fixo .n define o comprimento da sequência e deve ser um valor de 1 a 8.000.nbytes.varchar [(n | max)] (caracteres variados)
n define o comprimento da string e pode ser um valor de 1 a 8.000.max indica que o tamanho máximo de armazenamento é 2 ^ 31-1 bytes (2 GB).As diferenças são:
Outra diferença é o comprimento. O nchar e o nvarchar podem ter até 4.000 caracteres. E char e varchar podem ter até 8000 caracteres. Mas para o SQL Server, você também pode usar um [n] varchar (max) que pode manipular até 2.147.483.648 caracteres. (Dois gigabytes, um número inteiro de 4 bytes assinado.)
nchar requer mais espaço que nvarchar.
por exemplo,
Um nchar (100) sempre armazenará 100 caracteres, mesmo se você digitar apenas 5, os 95 caracteres restantes serão preenchidos com espaços. Armazenar 5 caracteres em um nvarchar (100) salvará 5 caracteres.
nchar (10) é uma cadeia de caracteres Unicode de comprimento fixo 10. nvarchar (10) é uma cadeia de caracteres Unicode de comprimento variável com um comprimento máximo de 10. Normalmente, você usaria a primeira se todos os valores de dados tiverem 10 caracteres e a segunda se os comprimentos variarem.
nchar é de tamanho fixo e pode conter caracteres unicode. usa dois bytes de armazenamento por caractere.
varchar é de tamanho variável e não pode conter caracteres unicode. ele usa um armazenamento de bytes por caractere.
UCS-2(que passa a ser a codificação usada pelo SQL Server) armazena cada personagem exatamente dois bytes, consulte msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx : SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes). SQL Server 2008 pode usar compressão SCSU, mas ainda é a compressão dos UCS-2 cadeias de caracteres Unicode codificados: msdn.microsoft.com/en-us/library/ee240835.aspx
O NVARCHAR pode armazenar caracteres Unicode e usa 2 bytes por caractere.
nvarcharsempre leva 2 bytes por caractere.