Escreva diferenças entre varchar e nvarchar

59

Atualmente, em nosso banco de dados do SQL Server 2012, estamos usando varchare gostaríamos de mudar isso nvarchar. Eu gerei um script para fazer isso.

Minha pergunta é: existem diferenças em como o SQL Server grava em varcharcolunas vs. nvarcharcolunas? Temos vários procedimentos de back-end que me preocupam.

Editar:
Não tenho certeza se isso ajuda, mas as colunas não têm índices, f / k ou restrições nelas.

Chris L
fonte
11
Veja também dba.stackexchange.com/questions/162113/…
Aaron Bertrand

Respostas:

46

Você precisa ter o prefixo de literais de seqüência de caracteres Unicode com um prefixo N. Por exemplo, eles funcionarão de maneira diferente se o tipo de dados subjacente for NVARCHAR:

CREATE TABLE dbo.t(c NVARCHAR(32));

INSERT dbo.t(c) SELECT 'រៀន';
INSERT dbo.t(c) SELECT 'នរៀ';
INSERT dbo.t(c) SELECT N'រៀន';

SELECT c FROM dbo.t;

SELECT c FROM dbo.t WHERE c = 'រៀន';
SELECT c FROM dbo.t WHERE c = N'រៀន';

Resultados:

c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!

c
----
???
??? -- probably not expected, however all Unicode characters have been changed to ?

c
----
រៀន

Para aqueles em dispositivos móveis ou navegadores decrépitos que mostram caracteres de caixa em vez de caracteres Unicode reais, é assim:

insira a descrição da imagem aqui

Aaron Bertrand
fonte
37

A maior preocupação é que nvarcharuse 2 bytes por caractere, enquanto varcharusa 1. Portanto, nvarchar(4000)usa a mesma quantidade de espaço de armazenamento que varchar(8000)*.

Além de todos os dados de seu personagem precisarem do dobro do espaço de armazenamento, isso também significa:

  • Pode ser necessário usar nvarcharcolunas mais curtas para manter as linhas dentro do limite da linha de 8060 bytes / 8000 caracteres.
  • Se você estiver usando nvarchar(max)colunas, elas serão enviadas para fora da linha mais cedo do que o varchar(max)faria.
  • Pode ser necessário usar nvarcharcolunas mais curtas para permanecer dentro do limite da chave de índice de 900 bytes (não sei por que você desejaria usar uma chave de índice tão grande, mas nunca sabe).

Além disso, trabalhar com nvarcharnão é muito diferente, supondo que o software do cliente seja construído para lidar com Unicode. O SQL Server converterá de forma transparente um up varcharpara nvarchar, para que você não precise estritamente do prefixo N para literais de string, a menos que esteja usando caracteres de 2 bytes (ou seja, Unicode) no literal. Esteja ciente de que a conversão nvarcharpara varbinaryproduzir resultados diferentes do que fazer o mesmo com varchar. O ponto importante é que você não precisará alterar imediatamente todo literal varchar para um literal nvarchar para manter o aplicativo funcionando, o que ajuda a facilitar o processo.

* Se você usar a compactação de dados (a compactação leve de linha é suficiente, é necessário o Enterprise Edition antes do SQL Server 2016 SP1 ), normalmente você encontrará nchare nvarcharnão ocupará mais espaço do que chare varchar, devido à compactação Unicode (usando o algoritmo SCSU) .

db2
fonte
17

Pense no seguinte são as principais diferenças:

  1. Nvarchar armazena dados UNICODE. Se você possui requisitos para armazenar dados UNICODE ou multilíngues, nvarchar é a escolha. O Varchar armazena dados ASCII e deve ser o seu tipo de dados preferido para uso normal.
  2. Em relação ao uso da memória, o nvarchar usa 2 bytes por caractere, enquanto o varchar usa 1.
  3. A associação de um VARCHAR ao NVARCHAR tem um impacto considerável no desempenho.
  4. Pode ser necessário um prefixo N ao inserir dados: INSERT dbo.t (c) SELECT N'ʤ ʥ ʦ ʧ ʨ ';
  5. Alguns especialistas recomendam o nvarchar sempre porque: como todos os sistemas operacionais e plataformas de desenvolvimento modernos usam Unicode internamente, o uso do nvarchar em vez do varchar evitará a conversão de codificação sempre que você ler ou gravar no banco de dados
rchacko
fonte
0

nvarchar era necessário para a replicação de mesclagem RDP de um banco de dados móvel para o SQL Server 2005. Também LTrim (), RTrim () e Trim () foram usados ​​muito bc nvarchar não aparou automaticamente () os espaços da entrada de dados, enquanto Varchar .

Não sei se isso mudou nos últimos anos ou não, mas agora o nvarchar é o padrão usado para logons do site de associação simples do .NET no VS Pro 2017 usado no banco de dados gerado.

Joseph Poirier
fonte
-3

Se você usa o NVarchar sobre Varchar e não precisa de suporte para MULTI-LINQUAL, aumenta o armazenamento para DB, Backups (local e externo). Os bancos de dados modernos devem oferecer suporte a ambos, e qualquer ocorrência de conversão deve ser considerada no design.

Bill Lindsay
fonte