Quand devons-nous utiliser NVARCHAR/NCHAR au lieu de VARCHAR/CHAR dans SQL Server?

y a-t-il une règle quand nous devons utiliser les types Unicode?

j'ai vu que la plupart des langues Européennes (allemand, italien, anglais, ...) sont très bien dans la même base de données dans les colonnes VARCHAR.

je cherche quelque chose comme:

  1. si vous avez Chinois -- > utilisez NVARCHAR
  2. si vous avez l'allemand et l'arabe -- > utiliser NVARCHAR

Qu'en est-il de la classement du serveur/base de données?

Je ne veux pas utiliser toujours NVARCHAR comme suggéré ici quelles sont les principales différences de performances entre les types de données varchar et nvarchar SQL Server?

61
demandé sur Community 2009-03-05 00:09:20

5 réponses

la vraie raison pour laquelle vous voulez utiliser NVARCHAR est quand vous avez langues différentes dans la même colonne, vous devez adresser les colonnes en T-SQL sans décodage, vous voulez être en mesure de voir les données" nativement " en SSMS, ou vous voulez standardiser sur Unicode.

si vous considérez la base de données comme un stockage muet, il est parfaitement possible de stocker des chaînes larges et des encodages différents (même de longueur variable) dans VARCHAR (par exemple UTF-8). Le le problème survient lorsque vous tentez de coder et de décoder, surtout si la page de code est différente pour des lignes différentes. Cela signifie également que le serveur SQL ne sera pas en mesure de traiter les données facilement à des fins de recherche dans T-SQL sur (potentiellement variable) colonnes encodées.

en utilisant NVARCHAR évite tout cela.

je recommande NVARCHAR pour n'importe quelle colonne qui aura les données entrées par l'utilisateur dans elle qui est relativement libre.

je recommande VARCHAR pour toute colonne qui est une clé naturelle (comme une plaque d'immatriculation de véhicule, SSN, numéro de série, Étiquette de service, numéro de commande, indicatif d'appel d'aéroport, etc) qui est généralement définie et limitée par une norme ou une législation ou une convention. Aussi VARCHAR pour entrée utilisateur, et très contraint (comme un numéro de téléphone) ou un code (actif/fermé, Y/N, M/F, M/S/D/W, etc). Il n'y a absolument aucune raison d'utiliser NVARCHAR pour ceux-ci.

donc pour un simple la règle:

VARCHAR lorsque la garantie sera limitée NVARCHAR autrement

105
répondu Cade Roux 2018-05-16 13:07:50

vous devez utiliser NVARCHAR chaque fois que vous devez stocker plusieurs langues. Je crois que vous devez l'utiliser pour les langues asiatiques, mais ne me citez pas dessus.

voici le problème si vous prenez le russe par exemple et le stocker dans un varchar, vous serez très bien tant que vous définissez la page de code correcte. Mais supposons que vous utilisiez une installation sql anglaise par défaut, alors les caractères russes ne seront pas manipulés correctement. Si vous utilisiez NVARCHAR () ils seraient manipulés correctement.

Modifier

OK permettez-moi de citer MSDN et maybee j'étais à préciser mais vous ne voulez pas stocker plus d'une page de code dans une colonne de varcar, alors que vous pouvez vous ne devriez pas

quand vous traitez avec des données de texte qui est stocké dans le char, varchar, varchar (max), ou le type de données de texte, le la plupart des limites importantes à considérer est - ce seulement une information d'un seul la page de code peut être validé par le système. (Vous pouvez stocker des données de plusieurs pages de code, mais ce n'est pas recommandé.) La page de code exacte utilisée pour valider et stocker les données dépend sur le classement de la colonne. Si un la collecte au niveau de la colonne n'a pas été défini, le classement de la base de données est utilisée. Pour déterminer la page de code qui est utilisé pour une colonne donnée, vous peut utiliser la propriété collation fonction, comme illustré ci-dessous exemples de codes:

En voici d'autres:

cet exemple illustre le fait que de nombreux endroits, tels que le géorgien et Hindi, n'ont pas de pages de code, car ils sont des collations Unicode seulement. Ceux les classements ne sont pas appropriés pour colonnes qui utilisent le char, varchar, ou texte type de données

donc Géorgien ou Hindi doit vraiment être stocké comme nvarchar. L'arabe est aussi un problème:

un autre problème vous pouvez rencontrer est l'incapacité de stocker des données tous les caractères que vous voulez le soutien est contenu dans le code page. Dans de nombreux cas, Windows considère une page de code particulière pour être un " meilleur page de code" fit", ce qui signifie qu'il y a aucune garantie que vous pouvez compter sur l' page de code pour gérer tout le texte; il est simplement le meilleur disponible. Un exemple de ceci est l'écriture arabe: il prend en charge un large éventail de langues, y compris Baluchi, berbère, Farsi, Cachemire, Kazakh, Kirghiz, Pashto, Sindhi, Uighur, Urdu, et plus encore. Tout ces langues ont supplémentaires des caractères autres que ceux de l'arabe langue telle que définie dans le code Windows page 1256. Si vous tentez de stocker ces caractères supplémentaires dans un non-Unicode colonne qui a l'arabe classement, les personnages sont convertis en points d'interrogation.

quelque chose à garder à l'esprit lorsque vous utilisez Unicode bien que vous pouvez stocker différentes langues dans un colonne simple vous ne pouvez trier qu'en utilisant une seule collation. Il y a des langues qui utilisent des caractères latins mais qui ne trient pas comme d'autres langues latines. Accents est un bon exemple de cela, je ne peux pas me rappeler l'exemple, mais il y avait une langue de l'Europe de l'est dont Y n'a pas trier comme le Y anglais. puis il y a l'Espagnol ch que les utilisateurs espagnols prévoient d'être triés après H.

en somme avec tous les problèmes que vous avez à traiter lorsque vous traitez de l'internalisation. C'est mon avis qui est plus facile d'utiliser des caractères Unicode dès le début, éviter les conversions supplémentaires et prendre la touche espace. D'où ma déclaration antérieure.

10
répondu JoshBerke 2009-03-05 02:56:20

Grec aurait besoin UTF-8 sur N Types de colonne: αβγ ;)

3
répondu cherouvim 2009-03-04 21:11:23

Josh dit: "....Quelque chose à garder à l'esprit lorsque vous utilisez Unicode bien que vous puissiez stocker différentes langues dans une colonne unique, vous ne pouvez trier qu'en utilisant une seule collation. Il y a des langues qui utilisent des caractères latins mais qui ne trient pas comme d'autres langues latines. Les Accents sont un bon exemple de cela, je ne peux pas me souvenir de l'exemple, mais il y avait une langue de l'Europe de l'est dont Y n'a pas trié comme le Y anglais. puis il y a l'Espagnol ch que les utilisateurs espagnols expectent d'être triés après H."

Je suis hispanophone et "ch" n'est pas une lettre mais deux "c" et " h " et l'alphabet espagnol est comme: abcdefghijklmn - opqrstuvwxyz Nous n'attendons pas" ch "après" h "mais" i" L'alphabet est le même qu'en anglais sauf pour le ñ ou en HTML "& ntilde; "

Alex

2
répondu Alex 2009-05-04 06:15:30

TL;DR;

Unicode (nchar, nvarchar et ntext)

Non-unicode (char, varchar et text).

de MSDN

Collations dans SQL Server fournir des règles de tri, case, et accent propriétés de sensibilité pour vos données. Les classements utilisés avec les types de données de caractères tels que char et varchar dictent la page de code et les caractères correspondants qui peuvent être représentés pour ces données type.

en supposant que vous utilisez la collation SQL par défaut SQL_Latin1_General_CP1_CI_AS alors script suivant devrait imprimer tous les symboles que vous pouvez tenir dans VARCHAR car il utilise un byte pour stocker un caractère (256 total) si vous ne le voyez pas sur la liste imprimée - vous avez besoin de NVARCHAR .

declare @i int = 0;
while (@i < 256)
begin
print cast(@i as varchar(3)) + '  '+  char(@i)  collate SQL_Latin1_General_CP1_CI_AS 
print cast(@i as varchar(3)) + '  '+ char(@i)  collate Japanese_90_CI_AS  
set @i = @i+1;
end

si vous changez collation pour let say japanese vous remarquerez que toutes les lettres européennes bizarres sont devenues normales et que certains symboles sont devenus des marques ? .

Unicode est une norme pour la mise en correspondance des points de code avec les caractères. Parce il est conçu pour couvrir tous les caractères de toutes les langues de l' monde, il n'y a pas besoin de différentes pages de code pour gérer différents jeux de caractères. Si vous stockez des données de caractères multiples langues, toujours utiliser les types de données Unicode (nchar, nvarchar, et ntext) au lieu des types de données non Unicode (char, varchar et text).

sinon ton tri va devenir bizarre.

0
répondu Matas Vaitkevicius 2016-03-23 15:22:15