Quelles sont les principales différences de performances entre les types de données varchar et nvarchar SQL Server?

236

Je travaille sur une base de données pour une petite application web dans mon école en utilisant SQL Server 2005.
Je vois quelques écoles de pensée sur la question de varcharvs nvarchar:

  1. À utiliser varcharsauf si vous traitez un grand nombre de données internationalisées, puis utilisez nvarchar.
  2. Utilisez-le nvarcharpour tout.

Je commence à voir les mérites du point de vue 2. Je sais que nvarchar occupe deux fois plus d'espace, mais ce n'est pas nécessairement énorme car cela ne va stocker des données que pour quelques centaines d'étudiants. Pour moi, il semble qu'il serait plus facile de ne pas s'en inquiéter et de simplement autoriser tout le monde à utiliser nvarchar. Ou y a-t-il quelque chose qui me manque?

Jason Baker
la source
question similaire ici: stackoverflow.com/questions/312170/… EDIT par le dorfier: ce qui, de façon intéressante, est exactement arrivé à la conclusion opposée.
Booji Boy
6
référence à un fil beaucoup plus étendu qui est arrivé à la conclusion opposée. stackoverflow.com/questions/312170/…
dkretz
2
Jason: J'espère que ce n'est pas une demande inappropriée, mais pouvez-vous s'il vous plaît envisager de changer la réponse acceptée aux gbn . La réponse de JoeBarone est horriblement mauvaise pour de nombreuses raisons. Le faire "accepter" induit les novices en erreur en faisant de mauvais choix. Il est inutile et inutile de "toujours utiliser NVARCHAR", et cela peut avoir des impacts très négatifs sur les performances et les coûts / budgets matériels. Quelques rangées, voire quelques milliers, n'auront pas d'importance. Mais les systèmes se développent plus rapidement que prévu, de sorte que la réponse actuellement acceptée ne rend pas service à la communauté. Je vous remercie.
Solomon Rutzky

Réponses:

140

Utilisez toujours nvarchar.

Vous n'aurez peut-être jamais besoin des caractères codés sur deux octets pour la plupart des applications. Cependant, si vous devez prendre en charge les langues à double octet et que vous ne disposez que d'une prise en charge à un seul octet dans votre schéma de base de données, il est très coûteux de revenir en arrière et de le modifier dans votre application.

Le coût de la migration d'une application de varchar vers nvarchar sera bien plus élevé que le peu d'espace disque supplémentaire que vous utiliserez dans la plupart des applications.

Joe Barone
la source
4
il est beaucoup plus difficile de revenir en arrière et d'ajouter la prise en charge des textes / messages multilingues, des fuseaux horaires, des unités de mesure et de la monnaie, donc tout le monde DOIT toujours les coder dans leur application dès le premier jour, TOUJOURS (même si ce n'est que sur votre page d'accueil Web app)!
KM.
82
Qu'en est-il de la taille de l'index, de l'utilisation de la mémoire, etc.? Je suppose que vous utilisez toujours int lorsque vous pouvez également utiliser tinyint "juste au cas où"?
gbn
99
Toujours coder / planifier un site multilingue (lorsque vous n'avez aucune idée que vous en aurez besoin), c'est comme dire à tous les jeunes adultes qu'ils devraient acheter un gros VUS à 8 places, gourmand en gaz pour leur première voiture ... après tout , ils pourraient se marier un jour et avoir 6 enfants,. Je préfère profiter des performances et de l'efficacité pendant que je le peux et payer le prix de la mise à niveau quand / si j'en ai besoin.
EJ Brennan
4
@cbmeeks: Je ne code pas pour ce que je ne sais pas . Mais si vous pouvez l'utiliser sans aucun impact notable sur les performances, alors vos bases de données ne sont pas assez grandes pour que cela ait de l'importance ...
gbn
60
Habituellement, lorsque les gens commencent leur réponse par le mot «toujours», vous devez ignorer tout ce qui vient après. (Remarquez que j'ai commencé cette déclaration avec le mot "habituellement" :)
Brandon Moore
226

L'espace disque n'est pas le problème ... mais la mémoire et les performances le seront. Double la lecture des pages, double taille de l'index, étrange LIKE et = comportement constant, etc.

Avez-vous besoin de stocker un script chinois, etc.? Oui ou non...

Et de MS BOL " Stockage et performances des effets d'Unicode "

Modifier :

Question SO récente soulignant à quel point les mauvaises performances de nvarchar peuvent être ...

SQL Server utilise un processeur élevé lors de la recherche dans les chaînes nvarchar

gbn
la source
19
+1, si votre application devient internationale, vous aurez de nombreux autres problèmes à craindre qu'une recherche / remplacement vers nvarchar: texte / messages multilingues, fuseaux horaires, unités de mesure et devise
KM.
2
Mais que se passe-t-il si vous devez parfois stocker un nom étranger, comme José ou Bjørn?
Qwertie
7
@Qwertie: alors vous utilisez nvarchar. Ce que vous ne faites pas, utilisez-le inutilement. Ces 2 noms entrent dans varchar de toute façon IIRC
GBN
6
Dire que l'espace disque n'est pas un problème n'est pas vrai pour tout le monde. Nous avons naïvement utilisé nvarchar inutilement dans une grande application bancaire avec des milliards d'enregistrements stockés sur plusieurs années. Avec un stockage SAN coûteux avec réplication, sauvegarde et reprise après sinistre, cela peut en fait se traduire par des millions de dollars en coûts pour nvarchar vs varchar. Sans oublier qu'il y a un impact important (100%) sur les performances d'avoir à lire deux fois plus d'octets du disque pour chaque lecture.
codemonkey
2
@codemonkey, et al: J'ai fait ce que j'ai pu pour résoudre le problème de l'espace perdu de manière holistique dans l'article suivant: Disk Is Cheap! ORLY? (une inscription gratuite est cependant requise). Cet article est destiné à éviter la situation dans laquelle codemonkey s'est heurtée concernant un stockage coûteux au niveau de l'entreprise.
Solomon Rutzky
59

Être cohérent! REJOINDRE un VARCHAR à NVARCHAR a un grand impact sur les performances.

Thomas Harlan
la source
115
Si vous effectuez des jointures sur des champs de caractères, votre base de données a probablement des problèmes pires que d'utiliser nvarchar ou varchar, en général.
Brandon Moore
@Thomas Harlan Un simple test me démontre qu'il n'y a pas de différence tangible entre se joindre nvarcharà varcharvs se convertir nvarcharà varcharet se joindre à varchar. Sauf si vous vouliez bien sûr être cohérent dans les types de données des colonnes, pas dans la jonction.
ajeh
1
@ajeh et Thomas: 1) les tests "simples" sont souvent trompeurs car ils ne couvrent pas les variations qui provoquent des différences de comportement. 2) Si l'on voit une performance drastique atteinte lors du mixage VARCHARet NVARCHAR, cela devrait être dû à l'indexation de la VARCHARcolonne ainsi qu'au type de classement utilisé pour cette colonne (et donc à l'index). Je couvre ce sujet en détail dans le billet de blog suivant: Impact sur les index lors du mélange des types VARCHAR et NVARCHAR .
Solomon Rutzky
44

nvarchar va avoir une surcharge importante en mémoire, stockage, jeu de travail et indexation, donc si les spécifications dictent que ce ne sera jamais vraiment nécessaire, ne vous embêtez pas.

Je n'aurais pas de règle stricte et rapide "toujours nvarchar" car cela peut être un gaspillage complet dans de nombreuses situations - en particulier ETL de ASCII / EBCDIC ou des identificateurs et des colonnes de code qui sont souvent des clés et des clés étrangères.

D'un autre côté, il y a beaucoup de cas de colonnes, où je serais sûr de poser cette question tôt et si je n'obtenais pas une réponse rapide et rapide, je ferais la colonne nvarchar.

Cade Roux
la source
26

J'hésite à ajouter une autre réponse ici car il y en a déjà pas mal, mais il faut faire quelques remarques qui n'ont pas été faites ou qui n'ont pas été faites clairement.

Premièrement: ne pas toujours utiliser NVARCHAR. C'est une attitude / approche très dangereuse et souvent coûteuse. Et il ne vaut pas mieux dire « N'utilisez jamais de curseurs» car ils sont parfois le moyen le plus efficace de résoudre un problème particulier, et la solution habituelle pour faire une WHILEboucle sera presque toujours plus lente qu'un curseur correctement fait.

La seule fois où vous devriez utiliser le terme "toujours" est lorsque vous conseillez de "toujours faire ce qui est le mieux pour la situation". Certes, cela est souvent difficile à déterminer, en particulier lorsque vous essayez d'équilibrer les gains à court terme en temps de développement (gestionnaire: "nous avons besoin de cette fonctionnalité - que vous ne connaissiez pas jusqu'à présent - il y a une semaine!") Avec une longue - les coûts de maintenance à long terme (gestionnaire qui a initialement fait pression sur l'équipe pour terminer un projet de 3 mois dans un sprint de 3 semaines: "pourquoi avons-nous ces problèmes de performance? Comment aurions-nous pu faire X qui n'a pas de flexibilité? Nous ne pouvons pas nous permettre un sprint ou deux pour résoudre ce problème. Que pouvons-nous faire en une semaine pour revenir à nos éléments prioritaires? Et nous devons certainement consacrer plus de temps à la conception afin que cela ne se reproduise pas! ").

Deuxièmement: @ gbn répond à certains points très importants à prendre en compte lors de certaines décisions de modélisation de données lorsque le chemin n'est pas clair à 100%. Mais il y a encore plus à considérer:

  • taille des fichiers journaux des transactions
  • temps de réplication (si vous utilisez la réplication)
  • temps nécessaire à ETL (si ETLing)
  • temps nécessaire pour envoyer les journaux à un système distant et les restaurer (si vous utilisez l'envoi de journaux)
  • taille des sauvegardes
  • durée nécessaire pour terminer la sauvegarde
  • temps nécessaire pour effectuer une restauration (cela peut être important un jour ;-)
  • taille nécessaire pour tempdb
  • performances des déclencheurs (pour les tables insérées et supprimées qui sont stockées dans tempdb)
  • performances du versionnage des lignes (si vous utilisez SNAPSHOT ISOLATION, car le magasin de versions est dans tempdb)
  • possibilité d'obtenir un nouvel espace disque lorsque le directeur financier dit qu'il vient de dépenser 1 million de dollars sur un SAN l'année dernière et qu'il n'autorisera donc pas 250 000 $ supplémentaires pour du stockage supplémentaire
  • durée nécessaire aux opérations INSERT et UPDATE
  • durée nécessaire à la maintenance de l'index
  • etc, etc, etc.

Le gaspillage d'espace a un énorme effet de cascade sur l'ensemble du système. J'ai écrit un article expliquant en détail ce sujet: le disque est bon marché! ORLY? (inscription gratuite requise; désolé, je ne contrôle pas cette politique).

Troisièmement: bien que certaines réponses se concentrent incorrectement sur l'aspect "il s'agit d'une petite application" et que certaines suggèrent correctement "d'utiliser ce qui est approprié", aucune des réponses n'a fourni de véritables orientations au PO. Un détail important mentionné dans la question c'est que c'est une page web pour leur école. Génial! Nous pouvons donc suggérer que:

  • Les champs pour les noms des étudiants et / ou des professeurs doivent probablement l' être NVARCHARcar, avec le temps, il est de plus en plus probable que des noms d'autres cultures apparaîtront à ces endroits.
  • Mais pour l'adresse et les noms de ville? Le but de l'application n'a pas été indiqué (cela aurait été utile) mais en supposant que les enregistrements d'adresse, le cas échéant, ne concernent qu'une région géographique particulière (c'est-à-dire une seule langue / culture), puis utilisez-la VARCHARavec la page de code appropriée (qui est déterminé à partir du classement du champ).
  • Si vous stockez des codes ISO d' État et / ou de pays (pas besoin de les stocker INT/ TINYINTpuisque les codes ISO sont de longueur fixe, lisibles par l'homme et bien, standard :) utilisez CHAR(2)pour les codes à deux lettres et CHAR(3)si vous utilisez des codes à 3 lettres. Et pensez à utiliser un classement binaire tel queLatin1_General_100_BIN2 .
  • Si vous stockez des codes postaux (c'est-à-dire des codes postaux), utilisez, VARCHARcar il s'agit d'une norme internationale de ne jamais utiliser de lettre en dehors de AZ. Et oui, utilisez toujours VARCHARmême si vous ne stockez que des codes postaux américains et non INT, car les codes postaux ne sont pas des nombres, ce sont des chaînes et certains d'entre eux ont un "0" en tête. Et pensez à utiliser un classement binaire tel queLatin1_General_100_BIN2 .
  • Si vous stockez des adresses e-mail et / ou des URL, utilisez-les NVARCHARcar les deux peuvent désormais contenir des caractères Unicode.
  • etc....

Quatrièmement: Maintenant que les NVARCHARdonnées occupent deux fois plus d'espace que nécessaire pour les données qui s'intègrent bien VARCHAR("s'intègre bien" = ne se transforme pas en "?") Et, d'une manière ou d'une autre, comme par magie, l'application s'est développée et maintenant il y a des millions d'enregistrements dans au moins un de ces champs où la plupart des lignes sont en ASCII standard mais certaines contiennent des caractères Unicode, vous devez donc les conserver NVARCHAR, tenez compte des points suivants:

  1. Si vous utilisez SQL Server 2008-2016 RTM et que vous êtes sur Enterprise Edition, OU si vous utilisez SQL Server 2016 SP1 (qui a rendu la compression de données disponible dans toutes les éditions) ou une version plus récente, vous pouvez activer la compression de données . La compression des données peut (mais pas "toujours") compresser les données Unicode dans les champs NCHARet NVARCHAR. Les facteurs déterminants sont:

    1. NCHAR(1 - 4000)et NVARCHAR(1 - 4000)utiliser le schéma de compression standard pour Unicode , mais uniquement à partir de SQL Server 2008 R2, ET uniquement pour les données IN ROW, pas OVERFLOW! Cela semble être meilleur que l'algorithme de compression ROW / PAGE habituel.
    2. NVARCHAR(MAX)et XML(et je suppose aussi VARBINARY(MAX), TEXTet NTEXT) les données IN ROW (pas hors ligne dans les pages LOB ou OVERFLOW) peuvent au moins être compressées en PAGE, mais pas en ROW. Bien sûr, la compression de PAGE dépend de la taille de la valeur en ligne: j'ai testé avec VARCHAR (MAX) et j'ai vu que 6000 lignes de caractères / octets ne se comprimeraient pas, mais 4000 lignes de caractères / octets le faisaient.
    3. Toutes les données OFF ROW, LOB ou OVERLOW = Aucune compression pour vous!
  2. Si vous utilisez SQL Server 2005 ou 2008-2016 RTM et non sur Enterprise Edition, vous pouvez avoir deux champs: un VARCHARet un NVARCHAR. Par exemple, supposons que vous stockiez des URL qui sont pour la plupart toutes des caractères ASCII de base (valeurs 0 - 127) et qui, par conséquent, tiennent dans VARCHAR, mais ont parfois des caractères Unicode. Votre schéma peut inclure les 3 champs suivants:

      ...
      URLa VARCHAR(2048) NULL,
      URLu NVARCHAR(2048) NULL,
      URL AS (ISNULL(CONVERT(NVARCHAR([URLa])), [URLu])),
      CONSTRAINT [CK_TableName_OneUrlMax] CHECK (
                        ([URLa] IS NOT NULL OR [URLu] IS NOT NULL)
                    AND ([URLa] IS NULL OR [URLu] IS NULL))
    );

    Dans ce modèle, vous ne sélectionnez que dans la [URL]colonne calculée. Pour l'insertion et la mise à jour, vous déterminez le champ à utiliser en voyant si la conversion modifie la valeur entrante, qui doit être de NVARCHARtype:

    INSERT INTO TableName (..., URLa, URLu)
    VALUES (...,
            IIF (CONVERT(VARCHAR(2048), @URL) = @URL, @URL, NULL),
            IIF (CONVERT(VARCHAR(2048), @URL) <> @URL, NULL, @URL)
           );
  3. Vous pouvez GZIP les valeurs entrantes VARBINARY(MAX)puis décompressez à la sortie:

    • Pour SQL Server 2005-2014: vous pouvez utiliser SQLCLR. SQL # (une bibliothèque SQLCLR que j'ai écrite) est livré avec Util_GZip et Util_GUnzip dans la version gratuite
    • Pour SQL Server 2016 et plus récent: vous pouvez utiliser les fonctions intégrées COMPRESSet DECOMPRESS, qui sont également GZip.
  4. Si vous utilisez SQL Server 2017 ou une version plus récente, vous pouvez envisager de faire de la table un index de colonnes en cluster.

  5. Bien que ce n'est pas une option viable encore, SQL Server 2019 introduit un support natif pour UTF-8 dans VARCHAR/ CHARtypes de données. Il y a actuellement trop de bogues avec lui pour qu'il soit utilisé, mais s'ils sont corrigés, alors c'est une option pour certains scénarios. Veuillez consulter mon article, " Prise en charge native UTF-8 dans SQL Server 2019: Sauveur ou faux prophète? ", Pour une analyse détaillée de cette nouvelle fonctionnalité.

Solomon Rutzky
la source
7
Battement lent. Tout simplement étonné que "toujours utiliser nvarchar" ait obtenu 140 votes et cela n'a pas été le cas. Excellent travail sur ce post.
schizoid04
1
@ schizoid04 Merci. Pour être honnête, la réponse acceptée a été publiée 7 ans avant la mienne, il y a donc beaucoup de trafic qui a voté dessus (et / ou divers autres) qui ne sont jamais revenus pour réévaluer. Pourtant, il fournit un contrepoint très solide à la théorie de la «sagesse de la foule» qui anime les forums basés sur les votes. Il y a trop de désinformation là-bas. Par exemple, ceci sur DBA.SE. L'autre réponse, acceptée avant de publier la mienne, est "correcte" par la plus étroite des définitions, trompeuse, et contient des informations que je réfute dans la mienne, mais elle dépasse toujours la mienne.
Solomon Rutzky
22

Pour votre application, nvarchar est très bien car la taille de la base de données est petite. Dire «toujours utiliser nvarchar» est une vaste simplification excessive. Si vous n'êtes pas obligé de stocker des choses comme Kanji ou d'autres personnages fous, utilisez VARCHAR, cela utilisera beaucoup moins d'espace. Mon prédécesseur dans mon travail actuel a conçu quelque chose en utilisant NVARCHAR quand il n'était pas nécessaire. Nous l'avons récemment remplacé par VARCHAR et avons économisé 15 Go sur cette table (il était très écrit). De plus, si vous avez alors un index sur cette table et que vous souhaitez inclure cette colonne ou créer un index composite, vous venez d'agrandir la taille de votre fichier d'index.

Soyez juste réfléchi dans votre décision; dans le développement SQL et les définitions de données, il semble rarement y avoir une "réponse par défaut" (à part éviter les curseurs à tout prix, bien sûr).

WebMasterP
la source
10

Étant donné que votre application est petite, il n'y a essentiellement aucune augmentation de coût appréciable pour l'utilisation de nvarchar sur varchar, et vous vous épargnez des maux de tête potentiels si vous avez besoin de stocker des données Unicode.

tbreffni
la source
8

En général; Commencez avec le type de données le plus cher qui a le moins de contraintes. Mettez-le en production . Si les performances commencent à être un problème, découvrez ce qui est réellement stocké dans ces nvarcharcolonnes. Y a-t-il des personnages qui ne rentreraient pas varchar? Sinon, passez à varchar. N'essayez pas de pré-optimiser avant de savoir où se trouve la douleur. Je suppose que le choix entre nvarchar / varchar n'est pas ce qui va ralentir votre application dans un avenir prévisible. Il y aura d'autres parties de l'application où le réglage des performances vous donnera beaucoup plus pour les dollars .

Kjetil Klaussen
la source
7

Depuis quelques années, tous nos projets utilisent NVARCHAR pour tout, car tous ces projets sont multilingues. Les données importées de sources externes (par exemple un fichier ASCII, etc.) sont converties en Unicode avant d'être insérées dans la base de données.

Je n'ai pas encore rencontré de problèmes liés aux performances des index plus grands, etc. Les index utilisent plus de mémoire, mais la mémoire est bon marché.

Que vous utilisiez des procédures stockées ou que vous construisiez du SQL à la volée, assurez-vous que toutes les constantes de chaîne sont préfixées par N (par exemple SET @foo = N'Hello world. ';) Afin que la constante soit également Unicode. Cela évite toute conversion de type de chaîne lors de l'exécution.

YMMV.

devstuff
la source
4
Vous n'avez probablement pas plusieurs centaines de millions d'enregistrements dans les tables avec lesquelles vous travaillez. Je conviens que pour la plupart des applications, la valeur par défaut de nvarchar est correcte, mais pas toutes.
Brandon Moore
7

Je peux parler d'expérience à ce sujet, méfiez-vous nvarchar. Sauf si vous en avez absolument besoin, ce type de champ de données détruit les performances sur une plus grande base de données. J'ai hérité d'une base de données qui souffrait en termes de performances et d'espace. Nous avons pu réduire de 70% la taille d'une base de données de 30 Go! Il y a eu quelques autres modifications pour améliorer les performances, mais je suis sûr que cela varchara également beaucoup aidé. Si votre base de données a le potentiel de développer des tables à plus d'un million d'enregistrements, restez à l'écart nvarcharà tout prix.

JA
la source
4

Je traite souvent cette question au travail:

  • Flux FTP d'inventaire et de prix - Les descriptions d'articles et autres textes étaient dans nvarchar lorsque varchar fonctionnait bien. La conversion de ces derniers en varchar a réduit la taille du fichier presque de moitié et a vraiment aidé avec les téléchargements.

  • Le scénario ci-dessus a bien fonctionné jusqu'à ce que quelqu'un mette un caractère spécial dans la description de l'article (peut-être une marque de commerce, je ne me souviens pas)

Je n'utilise toujours pas nvarchar à chaque fois via varchar. En cas de doute ou de potentiel pour les caractères spéciaux, j'utilise nvarchar. Je trouve que j'utilise varchar surtout lorsque je contrôle à 100% ce qui remplit le champ.

K Richard
la source
3

Pourquoi, dans toute cette discussion, n'a-t-il pas été fait mention de l'UTF-8? Être capable de stocker la plage de caractères unicode complète ne signifie pas qu'il faut toujours allouer deux octets par caractère (ou "point de code" pour utiliser le terme UNICODE). Tout ASCII est UTF-8. SQL Server vérifie-t-il pour les champs VARCHAR () que le texte est strict ASCII (c'est-à-dire le bit zéro du premier octet)? J'espère que non.

Si vous souhaitez ensuite stocker unicode et que vous souhaitez la compatibilité avec les anciennes applications ASCII uniquement, je pense que l'utilisation de VARCHAR () et UTF-8 serait la solution miracle: il n'utilise plus d'espace que nécessaire.

Pour ceux d'entre vous qui ne connaissent pas l'UTF-8, puis-je recommander un apprêt .

Tevya
la source
2
Ce que vous proposez peut fonctionner pour certaines applications, mais il faut également tenir compte de l'impact d'une couche d'encodage supplémentaire sur la façon dont le texte SQL est traité. En particulier, les classements, la recherche et la correspondance de motifs seront effectués. Et si des rapports sont exécutés par rapport à la base de données, les outils de rapport standard n'interviendront pas correctement les caractères multi-octets. Et des importations et des exportations en vrac peuvent être effectuées. Je pense que - à long terme - ce régime pourrait être plus problématique qu'il n'en vaut la peine.
Jeffrey L Whitledge
1
Il n'est pas possible de stocker UTF-8 dans des colonnes VARCHAR. MSSQL convertira toujours vos données UTF-8 dans le classement des colonnes. Si vous gâchez le classement (comme essayer de stocker CP1252 dans Latin_1), la conversion ne fonctionnera pas et vous vous retrouverez avec des octets supplémentaires dans vos données. Cela peut sembler fonctionner correctement lorsque vous convertissez latin_1 en UTF-8 (côté application) et de nouveau en latin_1 (côté db), mais ce n'est qu'une illusion. Vous pouvez vous faufiler par la conversion automatique de la base de données vers votre classement de colonne en utilisant freetds et en définissant le protocole sur quelque chose de moins de 7, mais vous perdez la possibilité d'interroger nvarchar.
chugadie
1
@chugadie et Tevya: cette réponse est un peu absurde. SQL Server utilise uniquement UCS-2 / UTF-16 pour stocker les données Unicode (c'est-à-dire les Ntypes XML et préfixés). Vous n'avez pas le choix d'utiliser UTF-8. De plus, les codages Unicode (UTF-8, UCS-2 / UTF-16 et UTF-32) ne peuvent pas être appliqués aux champs VARCHAR.
Solomon Rutzky
2

Il y aura des cas exceptionnels où vous voudrez restreindre délibérément le type de données pour vous assurer qu'il ne contient pas de caractères d'un certain ensemble. Par exemple, j'avais un scénario où j'avais besoin de stocker le nom de domaine dans une base de données. L'internationalisation des noms de domaine n'était pas fiable à l'époque, il était donc préférable de limiter l'entrée au niveau de la base et d'éviter tout problème potentiel.

Chris Halcrow
la source
1

Si vous utilisez NVARCHARsimplement parce qu'une procédure stockée système l'exige, l'occurrence la plus fréquente étant inexplicable sp_executesqlet que votre SQL dynamique est très long, vous feriez mieux de faire des manipulations de chaînes (concaténation, remplacement, etc.) du point de vue des performances, VARCHARpuis de convertir le résultat final NVARCHARet l'introduire dans le paramètre proc. Alors non, ne l'utilisez pas toujours NVARCHAR!

ajeh
la source