Question

varchar(255), varchar(256), nvarchar(255), nvarchar(256), nvarchar(max), etc?

256 semble comme une belle, ronde, l'espace-efficace nombre.Mais j'ai vu 255 beaucoup utilisé.Pourquoi?

Quelle est la différence entre varchar et nvarchar?

Était-ce utile?

La solution

VARCHAR(255).Il n'est pas utilisé tous les 255 caractères de stockage, juste le stockage dont vous avez besoin.C'est 255 et pas 256 parce que vous avez l'espace pour 255 plus le null-terminator (ou à la taille octets).

Le "N" est pour l'Unicode.Utilisation si vous vous attendez à des caractères non-ASCII.

Autres conseils

Dans MS SQL Server (7.0 et plus), de données varchar est représentée en interne avec jusqu'à trois valeurs:

  • La chaîne de caractères, qui sera de 0 à quelque chose de plus de 8000 octets (c'est basé sur la taille de la page, les autres colonnes stockées pour la ligne, et de quelques autres facteurs)
  • Deux octets utilisés pour indiquer combien de temps la chaîne de données est (qui produit une valeur de 0 à 8000+)
  • Si la colonne est nullable, un peu dans la ligne de nulle masque de bits (donc l'état null jusqu'à huit nullable les colonnes peuvent être représentés dans un seul octet)

L'important, c'est que les deux octets de données indicateur de longueur.Si c'était un octet, vous ne pouviez enregistrer correctement les chaînes de longueur 0 à 255;avec deux octets, vous pouvez enregistrer des chaînes de longueur 0 à quelque chose de plus 64000+ (plus précisément, 2^16 -1).Toutefois, la page de SQL Server longueur est de 8 ko, qui est où que 8000+ limite de caractères vient de.(Il y a des données de dépassement des trucs dans SQL 2005, mais si vos cordes sont va être long, vous devez juste aller avec varchar(max).)

Donc, peu importe combien de temps vous déclarez votre colonne de type de données varchar (à 15, 127, 511), ce que vous allez réellement être mémorisé pour chaque et chaque ligne est:

  • 2 octets pour indiquer combien de temps la chaîne est
  • La chaîne réelle, c'est à direle nombre de caractères dans une chaîne

Ce qui m'amène à mon point de vue:un certain nombre d'anciens systèmes utilisés seulement 1 octet pour stocker la longueur de la chaîne, et que limitée à une longueur maximale de 255 caractères, ce qui n'est pas si long.Avec 2 octets, vous n'avez pas de limite arbitraire...et donc je vous recommande de choisir un nombre qui fait sens pour la (présumée de non-axé sur la technique de l'utilisateur). J'50, 100, 250, 500, voire 1000.Étant donné que la base de 8000+ octets de stockage, 255, 256, est tout aussi efficace que 200 ou 250, et moins efficace lorsque vient le temps d'expliquer les choses pour les utilisateurs finaux.

Cela s'applique à un seul octet de données (c'est à direansii, SQL_Latin1*_*General_CP1, et.al.).Si vous devez stocker les données de plusieurs pages de code ou les langues utilisant des alphabets différents, vous aurez besoin de travailler avec le type de données nvarchar (qui je pense fonctionne de la même façon, deux octets pour le nombre de charactesr, mais chaque caractère réel de données nécessite deux octets de stockage).Si vous avez des chaînes susceptibles d'aller de plus de 8000, ou plus de 4000 dans nvarchar, vous aurez besoin d'utiliser le [n]varchar(max) les types de données.

Et si vous voulez savoir pourquoi il est très important de prendre de la place avec des octets supplémentaires juste pour suivre combien de temps les données sont, découvrez http://www.joelonsoftware.com/articles/fog0000000319.html

Philip

Il ya un couple de d'autres points à prendre en considération lors de la définition de char/varchar et la N de variations.

Tout d'abord, il y a une surcharge pour stocker des chaînes de longueur variable dans la base de données.Une bonne règle de base est d'utiliser des CHAR pour les chaînes de moins de 10 caractères de long, puisque N/VARCHAR magasins à la fois la chaîne et de la longueur et de la différence entre le stockage court les chaînes en N/CHAR vsN/VARCHAR moins de 10 ne vaut pas la surcharge de la longueur de la chaîne.

Deuxièmement, une table dans SQL server est stocké sur les pages de 8 ko, de sorte que la taille maximum de la ligne de données est de 8 060 octets (les autres 192 sont utilisés pour les frais généraux en SQL).C'est pourquoi SQL permet à un maximum défini colonne de type VARCHAR(8000) et de type NVARCHAR(4000).Maintenant, vous peut l'utilisation de type VARCHAR(MAX) et la version unicode.Mais il peut y avoir des frais généraux supplémentaires liés.

Si je ne me trompe pas, SQL server va essayer de stocker les données sur la même page que le reste de la ligne, mais, si vous essayez de mettre trop de données dans une colonne VARCHAR(Max), il va la traiter comme binaire et de le stocker sur une autre page.

Une autre grande différence entre les types CHAR et VARCHAR a à voir avec la page se divise.Étant donné que SQL Server stocke les données dans des pages de 8 ko, vous pouviez avoir n'importe quel nombre de lignes de données stockées sur une page.Si vous Mise à JOUR une colonne de type VARCHAR avec une valeur qui est assez grand pour que la ligne ne sera plus adapter à la page, le serveur split cette page, en s'éloignant d'un certain nombre de dossiers.Si la base de données n'a pas de pages disponibles et de la base de données est définie sur auto croître, le serveur va se développer la base de données d'allouer des pages vierges, c'est alors d'allouer des pages vierges à la table et enfin diviser la page en deux.

Si vous soutenez d'autres langues que l'anglais, vous souhaitez utiliser nvarchar.

HTML doit être acceptable tant qu'il contient des caractères ASCII standard.J'ai utilisé de type nvarchar principalement dans les bases de données qui ont été multi-support multilingue.

Parce qu'il y a 8-bits 1 octet et donc, dans 1 octet, vous pouvez stocker jusqu'à 256 valeurs distinctes qui est

0 1 2 3 4 5 ... 255

Remarque le premier nombre est 0, ce qui est un total de 256 les numéros.

Donc, si vous utilisez le type de données nvarchar(255) Il va utiliser 1 octet pour stocker la longueur de la chaîne mais si vous renversez par 1 et l'utilisation de type nvarchar(256), alors vous perdez 1 octet de plus juste pour que le surplus de 1 élément à partir de 255 (car vous avez besoin 2 octets pour stocker le nombre 256).

Qui pourrait ne pas être la réelle mise en œuvre de SQL server, mais je crois que c'est typique de raisonnement pour limiter les choses à plus de 255 256 éléments.

et nvarchar est pour Unicode, qui utilisent 2+ octets par caractère et
varchar est normal de texte ASCII qui n'utilise que 1 octet

IIRC, 255 est la taille max d'un varchar dans MySQL avant de vous dû passer pour le type de données texte, ou a été à un certain moment (en fait, je pense que c'est plus maintenant).Donc, pour la garder pour 255 pourriez vous acheter une certaine compatibilité là.Vous aurez envie de regarder cette place avant d'agir sur elle, si.

varchar vs nvarchar est un peu comme ascii vs unicode.varchar est limitée à un seul octet par caractère, de type nvarchar pouvez utiliser les deux.C'est pourquoi vous pouvez avoir un varchar(8000), mais seulement un type nvarchar(4000)

Les deux varchar et nvarchar automatique de la taille du contenu, mais le nombre que vous définissez lors de la déclaration du type de colonne est un maximum.

Les valeurs dans "nvarchar" prendre deux fois le disque/espace de mémoire que "varchar" parce que unicode est de deux octets, mais lorsque vous déclarez le type de la colonne de déclarer le nombre de caractères, pas d'octets.

Ainsi, lorsque vous définissez un type de colonne, vous devez déterminer le nombre maximal de caractères que la colonne ne sera jamais besoin de tenir et d'avoir ce que l'varchar (ou nvarchar) taille.

Une bonne règle de base est d'estimer la piqûre longueur de la colonne doit contenir, puis ajouter le support pour environ 10% plus de caractères pour éviter les problèmes avec une longueur inattendue de données dans le futur.

varchar(255) était également de la longueur maximale dans SQL Server 7.0 et versions antérieures.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top