O que se entende por nvarchar
?
Qual é a diferença entre char
, nchar
, varchar
, e nvarchar
no SQL Server?
sql-server
varchar
MrDatabase
fonte
fonte
n...
versões levar até duas vezes mais espaço de armazenamento como minha resposta mostraTodas 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.Devoluções
Observe que os caracteres
华
e国
ainda não foram representados naVARCHAR
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 umavarchar(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 úniconvarchar
caractere pode levar 2 ou 4 bytes.fonte
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 .
fonte
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!
fonte
Minha tentativa de resumir e corrigir as respostas existentes:
Em primeiro lugar,
char
enchar
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 quevarchar
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
envarchar
armazene seqüências de caracteres usando exatamente dois bytes por caractere,char
evarchar
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 é essenchar
envarchar
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
envarchar
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 camponchar
ounvarchar
. 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 Servernchar
ounvarchar
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
evarchar
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.
fonte
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 bitsfonte
char
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).fonte
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.)
fonte
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.
fonte
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.
fonte
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.
fonte
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.aspxO NVARCHAR pode armazenar caracteres Unicode e usa 2 bytes por caractere.
fonte
nvarchar
sempre leva 2 bytes por caractere.