Atualmente em nosso banco de dados SQL Server 2012, estamos usando varchar
o , e gostaríamos de mudar isso nvarchar
. Eu gerei um script para fazer isso.
Minha pergunta é se há alguma diferença em como o SQL Server grava em varchar
colunas versus nvarchar
colunas? Temos vários procedimentos de back-end com os quais estou preocupado.
Editar:
Não tenho certeza se isso ajuda, mas as colunas não possuem índices, f/k ou restrições nelas.
Você precisa ter certeza de prefixar os literais de string Unicode com um prefixo N. Por exemplo, eles funcionarão de maneira diferente se o tipo de dados subjacente for
NVARCHAR
:Resultados:
Para aqueles em dispositivos móveis ou navegadores decrépitos que mostram caracteres de caixa em vez de caracteres Unicode reais, é assim:
A maior preocupação é que
nvarchar
usa 2 bytes por caractere, enquantovarchar
usa 1. Assim,nvarchar(4000)
usa a mesma quantidade de espaço de armazenamento quevarchar(8000)
*.Além de todos os seus dados de personagem precisarem de duas vezes mais espaço de armazenamento, isso também significa:
nvarchar
colunas mais curtas para manter as linhas dentro do limite de linha de 8.060 bytes/limite de coluna de caracteres de 8.000 bytes.nvarchar(max)
colunas, elas serão empurradas para fora da linha mais cedo do quevarchar(max)
seriam.nvarchar
colunas mais curtas para ficar dentro do limite de chave de índice de 900 bytes (não sei por que você gostaria de usar uma chave de índice tão grande, mas nunca se sabe).Além disso, trabalhar com
nvarchar
não é muito diferente, supondo que seu software cliente seja construído para lidar com Unicode. O SQL Server converterá de forma transparente avarchar
paranvarchar
, portanto, você não precisa 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 lançarnvarchar
paravarbinary
produz resultados diferentes do que fazer o mesmo comvarchar
. O ponto importante é que você não precisará alterar imediatamente cada literal varchar para um literal nvarchar para manter o aplicativo funcionando, o que ajuda a facilitar o processo.* Se você usar compactação de dados (a compactação de linha leve é suficiente, Enterprise Edition necessária antes do SQL Server 2016 SP1 ), normalmente encontrará
nchar
envarchar
não ocupará mais espaço do quechar
evarchar
, devido à compactação Unicode (usando o algoritmo SCSU) .Pense que as seguintes são as principais diferenças:
nvarchar era necessário para replicação de mesclagem RDP de um banco de dados móvel para SQL Server 2005. Além disso, LTrim(), RTrim() e Trim() eram muito usados porque nvarchar não cortava automaticamente os espaços da entrada de dados, enquanto o Varchar fazia .
Não sei se isso mudou nos últimos anos ou não, mas nvarchar agora é o padrão usado para logins do site de associação simples do .NET no VS Pro 2017 usado no banco de dados gerado.
Se você usar NVarchar sobre Varchar e não tiver requisito de suporte a MULTI-LINQUAL, aumentará o armazenamento para banco de dados, backups (locais e externos). Bancos de dados modernos devem oferecer suporte a ambos e quaisquer ocorrências de conversão devem ser consideradas no design.