Question Quelle est la différence entre varchar et nvarchar?


Est-ce juste que nvarchar prend en charge les caractères multi-octets? Si tel est le cas, y a-t-il vraiment autre chose que des problèmes de stockage varchars?


1167
2017-09-27 19:34


origine


Réponses:


Un nvarchar colonne peut stocker toutes les données Unicode. UNE varchar La colonne est restreinte à une page de code de 8 bits. Certaines personnes pensent que varchar devrait être utilisé, car il prend moins de place. Je crois que ce n'est pas la bonne réponse. Les incompatibilités de la page de codes sont pénibles et Unicode est le remède aux problèmes de page de code. Avec un disque et une mémoire bon marché de nos jours, il n'y a vraiment aucune raison de perdre son temps à déblayer les pages de code.

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 les conversions d'encodage chaque fois que vous lisez ou écrivez dans la base de données. Les conversions prennent du temps et sont sujettes à des erreurs. Et la récupération des erreurs de conversion est un problème non trivial.

Si vous vous connectez avec une application qui n'utilise que l'ASCII, je recommanderais quand même d'utiliser Unicode dans la base de données. Les algorithmes de classement de l'OS et de la base de données fonctionneront mieux avec Unicode. Unicode évite les problèmes de conversion lors de l'interfaçage avec autre systèmes. Et vous allez vous préparer pour l'avenir. Et vous pouvez toujours valider que vos données sont limitées à l'ASCII 7 bits pour tout système existant que vous devez conserver, même si vous bénéficiez des avantages du stockage Unicode complet.


1435
2017-09-29 02:16



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 à partir de laquelle les données sont stockées.

nvarchar: Données de caractères Unicode de longueur variable. Dépend de l'assemblage de la base de données pour les comparaisons.

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


224
2017-09-27 19:37



J'utilise toujours nvarchar car il permet à tout ce que je construis de supporter à peu près toutes les données que je lance. Mon système de CMS fait chinois par accident, parce que j'ai utilisé nvarchar. Ces jours-ci, les nouvelles applications ne devraient pas vraiment se préoccuper de la quantité d'espace nécessaire.


61
2017-09-27 19:37



Ici vous pouvez voir les différences entre varchar et nvarchar.

Enter image description here

Enter image description here

Enter image description here

Enter image description here

Référence: SqlHints.com

Pour plus d'informations sur Nvarchar et varchar, voir ce blog.


42
2017-11-24 08:45



Cela dépend de la façon 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, génial. Utiliser VARCHAR et NVARCHAR sont à peu près identiques. 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. Un tel champ peut stocker toutes les données qui peuvent être encodées en utilisant ce jeu de caractères, et rien d'autre. Par exemple, si le jeu de caractères est MS-1252, vous ne pouvez stocker que des caractères comme des lettres anglaises, une poignée de lettres accentuées et quelques autres (comme € et -). Votre application ne serait utile qu'à 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.

Et l'espace de stockage? VARCHAR est généralement efficace, car le jeu de caractères / encodage a été conçu sur mesure pour un environnement local spécifique. Les champs NVARCHAR stockent soit le codage UTF-8 ou UTF-16, soit la base du paramètre NLS assez ironiquement. UTF-8 est très efficace pour les langues "occidentales", tout en supportant 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 qu'Oracle utilise UTF-8 ou UTF-16 selon les besoins.

Qu'en est-il de la vitesse de traitement? La plupart des nouvelles plates-formes de codage utilisent Unicode nativement (Java, .NET, même C ++ std :: wstring il y a des années!). Si le champ de base de données est VARCHAR, il force Oracle à convertir les jeux de caractères en lecture ou en écriture. L'utilisation de NVARCHAR évite la conversion.

Bottom line: Utilisez NVARCHAR! Il évite les limitations et les dépendances, convient à l'espace de stockage et est généralement le meilleur pour les performances.


29
2017-10-07 18:08



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


15
2017-09-27 19:36



Mes deux centimes

  1. Les index peuvent échouer lorsqu'ils n'utilisent pas les types de données corrects:
    Dans SQL Server: lorsque vous avez un index sur une colonne VARCHAR et lui présentez une chaîne Unicode, SQL Server n'utilise pas l'index. La même chose se produit lorsque vous présentez un BigInt à une colonne indexée contenant SmallInt. Même si BigInt est suffisamment petit pour être SmallInt, SQL Server ne peut pas utiliser l'index. L'inverse vous n'a pas ce problème (en fournissant SmallInt ou Ansi-Code à une colonne indexée BigInt ot NVARCHAR).

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


13
2018-04-19 09:53



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 de 16 bits permettant à des caractères de beaucoup d'autres langues comme l'arabe, l'hébreu, le chinois, le japonais, d'être codés dans un seul jeu de caractères.

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


11
2017-12-14 12:09



Tu as raison. nvarchar stocke les données Unicode varchar stocke les données de caractères à octet unique. Autres que les différences de stockage (nvarcharnécessite deux fois l'espace de stockage varchar), que vous avez déjà mentionné, la principale raison de préférer nvarchar plus de varchar serait l'internationalisation (c'est-à-dire le stockage des chaînes dans d'autres langues).


9
2017-09-27 19:42



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 la langue prend en charge nativement Unicode (chaînes par défaut sont Unicode, comme Java ou C #), alors allez nvarchar.

Si vous développez une application web, où les chaînes sont en UTF-8, et la langue est PHP, qui ne supporte toujours pas Unicode nativement (dans les versions 5.x), alors varchar sera probablement un meilleur choix.


8
2018-01-25 10:19