Actuellement dans notre base de données SQL Server 2012, nous utilisons varchar
, et nous aimerions changer cela nvarchar
. J'ai généré un script pour cela.
Ma question est la suivante: y a-t-il des différences dans la façon dont SQL Server écrit dans les colonnes varchar
par rapport aux colonnes nvarchar
? Nous avons un certain nombre de procédures backend qui me préoccupent.
Éditer:
Je ne sais pas si cela aide, mais les colonnes n'ont pas d'index, f/k ou contraintes.
Vous devez vous assurer que vous préfixez les littéraux de chaîne Unicode avec un préfixe N. Par exemple, ceux-ci fonctionneront différemment si le type de données sous-jacent est 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'រៀន';
Résultats:
c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!
c
----
???
??? -- probably not expected, however all Unicode characters have been changed to ?
c
----
រៀន
Pour ceux sur les appareils mobiles ou les navigateurs décrépits qui affichent des caractères de boîte au lieu de caractères Unicode réels, voici à quoi cela ressemble:
La plus grande préoccupation est que nvarchar
utilise 2 octets par caractère, tandis que varchar
en utilise 1. Ainsi, nvarchar(4000)
utilise la même quantité d'espace de stockage que varchar(8000)
*.
En plus de toutes vos données de personnage nécessitant deux fois plus d'espace de stockage, cela signifie également:
nvarchar
plus courtes pour conserver les lignes dans la limite de 8060 octets/8000 octets.nvarchar(max)
, elles seront poussées hors ligne plus tôt que varchar(max)
.nvarchar
plus courtes pour respecter la limite de clé d'index de 900 octets (je ne sais pas pourquoi vous souhaitez utiliser une clé d'index aussi grande, mais vous ne savez jamais).En plus de cela, travailler avec nvarchar
n'est pas très différent, en supposant que votre logiciel client est conçu pour gérer Unicode. SQL Server convertira de manière transparente un varchar
en nvarchar
, vous n'avez donc pas strictement besoin du préfixe N pour les littéraux de chaîne, sauf si vous utilisez des caractères à 2 octets (c'est-à-dire Unicode) dans le littéral. Sachez que la conversion de nvarchar
en varbinary
donne des résultats différents de la même chose avec varchar
. Le point important est que vous n'aurez pas à changer immédiatement chaque littéral varchar en littéral nvarchar pour que l'application fonctionne, ce qui facilite le processus.
* Si vous utilisez la compression de données (la compression de ligne légère est suffisante, Enterprise Edition requise avant SQL Server 2016 SP1 ), vous trouverez généralement nchar
et nvarchar
ne prennent pas plus de place que char
et varchar
, en raison de compression Unicode (en utilisant l'algorithme SCSU) .
Pensez que les différences suivantes sont majeures:
nvarchar était requis pour la réplication de fusion RDP d'une base de données mobile vers SQL Server 2005. De plus LTrim (), RTrim () et Trim () ont été beaucoup utilisés. .
Je ne sais pas si cela a changé ces dernières années ou non, mais nvarchar est maintenant la norme utilisée pour les connexions au site Web d'adhésion simple .NET sur VS Pro 2017 utilisée dans la base de données générée.