web-dev-qa-db-fra.com

Quelle est la différence entre varchar et nvarchar?

Est-ce juste que nvarchar supporte les caractères multi-octets? Si tel est le cas, y a-t-il vraiment un intérêt, en dehors des problèmes de stockage, à utiliser varchars?

1283
stimms

Une colonne nvarchar peut stocker toutes les données Unicode. Une colonne varchar est limitée à une page de codes de 8 bits. Certaines personnes pensent que varchar devrait être utilisé car cela prend moins de place. Je crois que ce n'est pas la bonne réponse. Les incompatibilités entre les pages de code sont pénibles et Unicode est le remède contre les problèmes de page de code. Avec les disques et la mémoire bon marché de nos jours, il n’ya vraiment aucune raison de perdre du temps à fouiller dans les pages de codes.

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 pouvez éviter d'effectuer des conversions de codage à chaque lecture ou écriture dans la base de données. Les conversions prennent du temps et sont sujettes aux erreurs. Et la récupération des erreurs de conversion est un problème non trivial.

Si vous vous connectez à une application qui utilise uniquement ASCII, je vous recommanderais quand même d'utiliser Unicode dans la base de données. Les algorithmes de classement des systèmes d'exploitation et des bases de données fonctionneront mieux avec Unicode. Unicode évite les problèmes de conversion lors de l'interfaçage avec des systèmes autres. Et vous vous préparerez pour l'avenir. Et vous pouvez toujours valider que vos données sont limitées à ASCII 7 bits, quel que soit le système hérité que vous devez gérer, tout en bénéficiant des avantages du stockage Unicode intégral.

1561
Jeffrey L Whitledge

varchar : données de caractères de longueur variable non-Unicode. Le classement de la base de données détermine la page de code utilisée pour stocker les données.

nvarchar : Données de caractère Unicode de longueur variable. Dépend du classement de la base de données pour les comparaisons.

Fort de cette connaissance, utilisez celle qui correspond à vos données d'entrée (ASCII v. Unicode).

240
user7116

J'utilise toujours nvarchar car cela permet à tout ce que je construis de résister à pratiquement toutes les données que je lui envoie. Mon système CMS utilise le chinois par accident, car j’ai utilisé nvarchar. De nos jours, les nouvelles applications ne devraient pas être vraiment préoccupées par la quantité d’espace requise.

64
tags2k

Cela dépend de la manière dont Oracle a été installé. Au cours du processus d'installation, l'option NLS_CHARACTERSET est définie. Vous pourrez peut-être le trouver avec la requête SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'.

Si votre NLS_CHARACTERSET est un encodage Unicode comme UTF8, tant mieux. L'utilisation de VARCHAR et de NVARCHAR est pratiquement identique. Arrêtez de lire maintenant, allez-y. Sinon, ou si vous n'avez aucun contrôle sur le jeu de caractères Oracle, lisez la suite.

VARCHAR - Les données sont stockées dans le codage NLS_CHARACTERSET. S'il existe d'autres instances de base de données sur le même serveur, vous pouvez être limité par elles; et vice versa, puisque vous devez partager le réglage. n tel champ peut stocker toutes les données pouvant être encodées à l'aide de ce jeu de caractères, et rien d'autre. Ainsi, par exemple, si le jeu de caractères est MS-1252, vous ne pouvez stocker que des caractères tels que des lettres anglaises, une poignée de lettres accentuées et quelques autres (comme € et -). Votre application ne serait utile que dans quelques endroits, incapable de fonctionner ailleurs dans le monde. Pour cette raison, il est considéré comme une mauvaise idée.

NVARCHAR - Les données sont stockées dans un codage Unicode. Chaque langue est supportée. Une bonne idée.

Qu'en est-il de l'espace de stockage? VARCHAR est généralement efficace, car le jeu de caractères/codage a été conçu sur mesure pour une langue spécifique. Les champs NVARCHAR stockent soit dans le codage UTF-8, soit dans le codage UTF-16, sur la base du réglage NLS assez ironiquement. UTF-8 est très efficace pour les langues "occidentales", tout en prenant en charge les langues asiatiques. UTF-16 est très efficace pour les langues asiatiques, tout en prenant en charge les langues "occidentales". Si vous êtes préoccupé par l'espace de stockage, choisissez un paramètre NLS pour obliger Oracle à utiliser UTF-8 ou UTF-16 selon le cas.

Qu'en est-il de la vitesse de traitement? La plupart des nouvelles plates-formes de codage utilisent Unicode de manière native (Java, .NET, voire C++ std :: wstring d'il y a des années!). Par conséquent, si le champ de base de données est VARCHAR, il oblige Oracle à convertir les jeux de caractères entre chaque lecture et écriture, ce qui n'est pas très bon. L'utilisation de NVARCHAR évite la conversion.

Bottom line: Utilisez NVARCHAR! Cela évite les limitations et les dépendances, convient parfaitement pour l’espace de stockage et est généralement également plus performant.

28
Jeremy Frank

nvarchar stocke les données au format Unicode. Par conséquent, si vous prévoyez de stocker des données multilingues (plusieurs langues) dans une colonne de données, vous avez besoin de la variante N.

17
albertein

Mes deux centimes

  1. Les index peuvent échouer s'ils n'utilisent pas les types de données appropriés:
    Dans SQL Server: lorsque vous avez un index sur une colonne VARCHAR et le présentez sous la forme d'une chaîne Unicode, SQL Server ne l'utilise pas. La même chose se produit lorsque vous présentez un BigInt à une colonne indexée contenant SmallInt. Même si le BigInt est assez petit pour être un SmallInt, SQL Server n'est pas capable d'utiliser l'index. L’inverse ne vous pose pas ce problème (lors de la fourniture de SmallInt ou Ansi-Code à une colonne BigInt ot NVARCHAR indexée).

  2. Les types de données peuvent varier entre différents SGBD (DataBase Management System):
    Sachez que chaque base de données a des types de données légèrement différents et que VARCHAR ne signifie pas la même chose partout. Tandis que SQL Server contient VARCHAR et NVARCHAR, une base de données Apache/Derby ne contient que VARCHAR, et VARCHAR est au format Unicode.

14
incomudro

Principalement nvarchar stocke les caractères Unicode et varchar stocke les caractères non-Unicode.

"Unicodes" signifie un système de codage de caractères à 16 bits permettant aux caractères de beaucoup d'autres langues comme l'arabe, l'hébreu, le chinois et le japonais d'être codés dans un seul jeu de caractères.

Cela signifie qu'unicodes utilise 2 octets par caractère pour stocker et que les non-unicodes n'utilisent qu'un octet par caractère à stocker. Ce qui signifie que les unicodes ont besoin d'une double capacité de stockage par rapport aux non-unicodes.

12
ranjit pawar

Je dirais que ça dépend.

Si vous développez une application de bureau, où le système d'exploitation fonctionne en Unicode (comme tous les systèmes Windows actuels) et si la langue prend en charge nativement Unicode (les chaînes par défaut sont Unicode, comme dans Java ou C #), puis entrez nvarchar.

Si vous développez une application Web, où les chaînes sont au format UTF-8, et le langage utilisé est PHP, qui ne prend toujours pas en charge le format Unicode de manière native (dans les versions 5.x), varchar sera probablement un meilleur choix.

9
sleepy012

Vous avez raison. nvarchar stocke les données Unicode tandis que varchar stocke les données codées sur un octet. Hormis les différences de stockage (nvarchar nécessite deux fois plus d’espace de stockage que varchar), ce que vous avez déjà mentionné, la principale raison de préférer nvarchar à varchar serait l’internationalisation (c'est-à-dire le stockage chaînes dans d'autres langues).

9
Mike Spross

Bien que NVARCHAR stocke Unicode, vous devriez envisager de le classer. Vous pouvez également utiliser VARCHAR et sauvegarder vos données dans les langues locales.

Imaginez juste le scénario suivant.

Le classement de votre base de données est en persan et vous enregistrez une valeur telle que "علی" (écriture persane de ALi) dans le type de données VARCHAR(10). Il n'y a pas de problème et le SGBD utilise seulement trois octets pour le stocker.

Toutefois, si vous souhaitez transférer vos données vers une autre base de données et voir le résultat correct, votre base de données de destination doit avoir le même classement que la cible, qui est Persian dans cet exemple.

Si votre classement cible est différent, des points d'interrogation (?) Apparaissent dans la base de données cible.

Enfin, rappelez-vous que si vous utilisez une énorme base de données destinée à l’utilisation de votre langue locale, je vous recommanderais d’utiliser un lieu plutôt que d’utiliser trop d’espaces.

Je crois que le design peut être différent. Cela dépend de l'environnement sur lequel vous travaillez.

6
Ali Elmi

Si un seul octet est utilisé pour stocker un caractère, il existe 256 combinaisons possibles. Vous pouvez ainsi enregistrer 256 caractères différents. La collation est le modèle qui définit les caractères et les règles selon lesquelles ils sont comparés et triés.

1252, qui est le latin1 (ANSI), est le plus commun. Les jeux de caractères à un octet ne permettent pas non plus de stocker tous les caractères utilisés par de nombreuses langues. Par exemple, certaines langues asiatiques ont des milliers de caractères, elles doivent donc utiliser deux octets par caractère.

Norme Unicode

Lorsque des systèmes utilisant plusieurs pages de codes sont utilisés dans un réseau, il devient difficile de gérer les communications. Pour normaliser les choses, les consortiums ISO et Unicode ont introduit le nicode. Unicode utilise deux octets pour stocker chaque caractère. Cela signifie que 65 536 caractères différents peuvent être définis, de sorte que presque tous les caractères peuvent être couverts avec Unicode. Si deux ordinateurs utilisent Unicode, chaque symbole sera représenté de la même manière et aucune conversion n’est nécessaire - c’est l’idée qui sous-tend Unicode.

SQL Server a deux catégories de types de données de caractères:

  • non-Unicode (car, varchar et text)
  • Unicode (nchar, nvarchar et ntext)

Si nous devons sauvegarder des données de personnage de plusieurs pays, utilisez toujours Unicode.

6
Jithin Shaji

nVarchar vous aidera à stocker des caractères Unicode. C'est la voie à suivre si vous souhaitez stocker des données localisées.

6
Vijesh VP

Je dois dire ici (je réalise que je vais probablement m'ouvrir à un slating!), Mais sûrement le seul moment où NVARCHAR est en réalité plus utile (notez le plus ici!) que VARCHAR lorsque tous les classements de tous les systèmes dépendants et dans la base de données elle-même sont les mêmes ...? Sinon, la conversion de classement doit quand même avoir lieu et rend donc VARCHAR aussi viable que NVARCHAR.

Pour ajouter à cela, certains systèmes de base de données, tels que SQL Server (avant 2012) ont une taille de page d'env. 8K. Donc, si vous envisagez de stocker des données interrogeables non contenues dans quelque chose comme un champ TEXT ou NTEXT, alors VARCHAR fournit la totalité de l'espace de 8k alors que NVARCHAR ne fournit que 4k (double les octets, double l'espace).

Je suppose que, pour résumer, l’utilisation de l’un ou de l’autre dépend:

  • Projet ou contexte
  • Infrastructure
  • Système de base de données
5
Paul

La principale différence entre Varchar(n) et nvarchar(n) est la suivante: enter image description here

Varchar (taille de caractères variable, données de caractère non Unicode) jusqu'à 8000. 1.C'est un type de données de longueur variable

  1. Utilisé pour stocker des caractères non-Unicode

  2. Occupe 1 octet d'espace pour chaque personnage

enter image description here

Nvarchar: données de caractères Unicode de longueur variable.

1.Il s'agit d'un type de données de longueur variable

2.Utilisé pour stocker des caractères Unicode.

  1. Les données sont stockées dans un codage Unicode. Chaque langue est supportée. (par exemple les langues arabe, allemande, hindi, etc.)
5
Debendra Dash

J'ai jeté un coup d'œil aux réponses et beaucoup semblent recommander d'utiliser nvarchar sur varchar, car l'espace n'est plus un problème, il n'est donc pas gênant d'activer Unicode pour un stockage très réduit. Eh bien, ce n'est pas toujours vrai lorsque vous souhaitez appliquer un index sur votre colonne. SQL Server limite la taille du champ que vous pouvez indexer à 900 octets. Donc, si vous avez une varchar(900), vous pouvez toujours l'indexer, mais pas varchar(901). Avec nvarchar, le nombre de caractères est réduit de moitié, vous pouvez donc indexer jusqu'à nvarchar(450). Donc, si vous êtes sûr de ne pas avoir besoin de nvarchar, je vous déconseille de l'utiliser.

En général, dans les bases de données, je vous recommande de vous en tenir à la taille dont vous avez besoin, car vous pouvez toujours développer. Par exemple, un collègue au travail a déjà pensé qu'il n'y avait aucun mal à utiliser nvarchar(max) pour une colonne, car nous n'avons aucun problème de stockage. Plus tard, lorsque nous avons essayé d'appliquer un index sur cette colonne, SQL Server l'a rejeté. Si, toutefois, il commençait avec même varchar(5), nous aurions simplement pu l'étendre ultérieurement à ce dont nous avons besoin sans un tel problème, qui nous obligerait à élaborer un plan de migration sur le terrain pour résoudre ce problème.

5
Rafid

Suivez Différence entre le type de données VARCHAR Sql Server et NVARCHAR. Ici, vous pouvez voir de manière très descriptive.

En général, nvarchar stocke les données au format Unicode. Ainsi, si vous prévoyez de stocker des données multilingues (plusieurs langues) dans une colonne de données, vous avez besoin de la variante N.

5
Pradeep Kesharwani

Jeffrey L Whitledge avec ~ 47000 score de réputation recommande l'utilisation de nvarchar

Solomon Rutzky avec ~ 33200 points de réputation recommande: N'utilisez PAS toujours NVARCHAR. C'est une attitude/approche très dangereuse et souvent coûteuse.

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

https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4

Les deux personnes d’une telle réputation, que choisit un développeur de base de données apprentissage serveur SQL?

Les réponses et les commentaires relatifs aux problèmes de performances comportent de nombreux avertissements si vous n'êtes pas cohérent dans vos choix.

Il y a des commentaires pro/con nvarchar pour la performance.

Il y a des commentaires pro/con varchar pour la performance.

J'ai un besoin particulier pour une table avec plusieurs centaines de colonnes, ce qui en soi est probablement inhabituel?

Je choisis varchar pour éviter de s'approcher de la limite de taille d'enregistrement de table de 8060 octets de SQL * server 2012.

L'utilisation de nvarchar, pour moi, dépasse cette limite de 8060 octets.

Je pense également que je devrais faire correspondre les types de données des tables de codes connexes aux types de données de la table centrale principale.

J'ai vu l'utilisation de la colonne varchar sur ce lieu de travail, gouvernement d'Australie-Méridionale, par des développeurs de bases de données expérimentés, où le nombre de lignes de la table va atteindre plusieurs millions ou plus (et très peu de colonnes nvarchar, le cas échéant, dans ces très grandes tables), alors peut-être que les volumes de lignes de données attendus feront partie de cette décision.

1
Allan F

nvarchar est sûr à utiliser par rapport à varchar afin de rendre notre code exempt d'erreur (incompatibilité de types) car nvarchar autorise également les caractères Unicode. Lorsque nous utilisons la condition where dans une requête SQL Server et si nous utilisons l'opérateur =, une erreur est parfois générée. La raison probable en est que notre colonne de mappage sera définie dans varchar. Si nous le définissons dans nvarchar ce problème ne se produira pas. Néanmoins, nous nous en tenons à varchar et pour éviter ce problème, nous ferions mieux d'utiliser LIKE clé Word plutôt que =.

0
Rinoy Ashokan