O que se entende por nvarchar
?
Qual é a diferença entre char
, nchar
, varchar
, e nvarchar
no SQL Server?
O que se entende por nvarchar
?
Qual é a diferença entre char
, nchar
, varchar
, e nvarchar
no SQL Server?
Respostas:
Apenas para esclarecer ... ou resumir ...
nchar
e nvarchar
pode armazenar caracteres Unicode .char
e não pode armazenar caracteres Unicode .varchar
char
e nchar
sã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.varchar
e nvarchar
são de tamanho variável, que só ocupam espaços para os caracteres que você armazena. Não reservará armazenamento como char
ounchar
.nchar
e nvarchar
ocupará 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 VARCHAR
versã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 nvarchar
caractere 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, 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 que varchar
envarchar
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, nchar
e nvarchar
armazene seqüências de caracteres usando exatamente dois bytes por caractere, char
e varchar
use 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 nchar
e nvarchar
tende 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, nchar
e nvarchar
colunas 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 nchar
ou 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 nchar
ou nvarchar
campo, 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 char
e varchar
podem 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 bitschar
nã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.n
bytes.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-Unicode
Dados de string de comprimento fixo .n
define o comprimento da sequência e deve ser um valor de 1 a 8.000.n
bytes.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.
nvarchar
sempre leva 2 bytes por caractere.