web-dev-qa-db-fra.com

Écrire les différences entre varchar et nvarchar

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.

65
Chris L

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:

enter image description here

51
Aaron Bertrand

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:

  • Vous devrez peut-être utiliser des colonnes nvarchar plus courtes pour conserver les lignes dans la limite de 8060 octets/8000 octets.
  • Si vous utilisez des colonnes nvarchar(max), elles seront poussées hors ligne plus tôt que varchar(max).
  • Vous devrez peut-être utiliser des colonnes 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) .

41
db2

Pensez que les différences suivantes sont majeures:

  1. Nvarchar stocke les données UNICODE. Si vous avez besoin de stocker des données UNICODE ou multilingues, nvarchar est le choix. Varchar stocke les données ASCII et doit être le type de données de votre choix pour une utilisation normale.
  2. Concernant l'utilisation de la mémoire, nvarchar utilise 2 octets par caractère, tandis que varchar en utilise 1.
  3. JOINDRE un VARCHAR à NVARCHAR a un impact considérable sur les performances.
  4. Pourrait avoir besoin d'un préfixe N lors de l'insertion de données: INSERT dbo.t (c) SELECT N'ʤ ʥ ʦ ʧ ʨ ';
  5. Certains experts recommandent toujours nvarchar car: étant donné que tous les systèmes d'exploitation et plates-formes de développement modernes utilisent Unicode en interne, en utilisant nvarchar plutôt que varchar, vous éviterez de coder les conversions chaque fois que vous lisez ou écrivez dans la base de données
20
rchacko

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.

0
Joseph Poirier