Quelle est la différence entre varchar(10) varchar(1000) lorsque nous stockons chaîne dont la longueur est inférieure à 10?
Je comprends la différence entre char
et varchar
mais je ne suis pas sûr de la signification exacte de varchar longueur maximale.
Lorsque nous stockons string
dont la longueur est inférieure à 10, quelle est la différence entre varchar(10)
et varchar(100)
?
Je pense que dans les deux cas, l'utilisation d'un même espace et ont les mêmes performances. Si oui, pourquoi avons-nous besoin varchar max limite?
Est-il suffisant pour une utilisation juste "varchar
" au lieu de "varchar(xxx)
"?
(ajouté), je suis de l'utilisation de MySQL 5.0.67
- Peut dépendre sur le produit que vous utilisez. S'il vous plaît ajouter un tag pour un SGBDR produit.
- Je suis de l'utilisation de MySQL, mais paxdiablo la réponse est assez pour moi. De toute façon, j'ai ajouté MySQL étiquette
Vous devez vous connecter pour publier un commentaire.
Cela dépend entièrement sur le moteur de SGBD utilisé. SQL elle-même ne prévoit pas comment les choses sont stockées physiquement, juste la façon dont ils sont vus de manière logique.
Par exemple, votre SGBD peut allouer de l'espace dans la ligne de la taille maximale, en plus de quelques octets supplémentaires pour stocker la longueur. Dans ce cas, il y aurait une grande différence entre
varchar(10)
etvarchar(1000)
puisque vous feront perdre un peu d'espace par ligne.Alternativement, il peut utiliser un pool de mémoire tampon pour le
varchar
de données et de les stocker uniquement la longueur et le pool de tampons "adresse de départ" de la ligne. Dans ce cas, chaque ligne de magasin de taille identique des informations pour unevarchar
colonne indépendamment de sa taille, mais il y aurait une étape supplémentaire pour extraire les données réelles dans la colonne (suivant le lien vers le pool de mémoire tampon).La raison pour laquelle vous utilisez un
varchar
est exactement pourquoi il est nommévarchar
. Il permet de stocker des variables de la taille des éléments de données. Généralement,char(10)
vous donne dix caractères, n'importe quoi, rembourrage avec des espaces si vous insérez quelque chose de plus court. Vous pouvez découper les espaces à droite comme vous l'extraire, mais qui ne fonctionne pas tellement bien si les données que vous souhaitez stocker est en fait"hello "
, avec un point de l'espace que vous souhaitez préserver.Un décent SGBD moteur peut décider de faire un compromis en fonction de la taille maximale de la
varchar
colonne. Pour ceux à court, elle pourrait tout stocker en ligne dans la ligne et de consommer les octets supplémentaires pour la taille.Plus
varchar
colonnes pourrait être "externalisés", à un pool de mémoire tampon pour s'assurer de la ligne de lecture est conservé efficace (au moins jusqu'à ce que vous besoin la grandevarchar
colonne, de toute façon).Ce que vous devez faire est de re-poser la question pour votre SGBD spécifique de manière à obtenir une réponse ciblée.
Ou, en toute honnêteté, ingénieur de votre base de données pour stocker uniquement la taille maximale. Si vous savez qu'il est de 10, alors
varchar(1000)
est un déchet. Si, dans l'avenir, vous avez besoin pour agrandir la colonne, que est le temps de le faire, plutôt que de maintenant (voir YAGNI).Pour MySQL, vous aurez envie de chercher à
Chapitre 14 Moteurs de Stockage
de la documentation en ligne.Il couvre les différents moteurs de stockage (comme InnoDB et MyISAM) que MySQL utilise et, en regardant assez profond, vous pouvez voir comment l'information est stockée physiquement.
Par exemple, en MyISAM, la présence de la longueur variable des données dans une table (
varchar
inclus) signifie généralement les tableaux dynamiques. Cela suit un schéma à peu près analogue au pool de mémoire tampon concept je l'ai mentionné ci-dessus, avec l'avantage que moins d'espace est gaspillé pour la variable de la taille des colonnes, et l'inconvénient que les lignes peuvent se fragmenter.L'autre format de stockage (actualisation format compressé car il n'est vraiment utilisé pour les tables en lecture seule) est la statique, où les données sont stockées dans une seule ligne physique.
Informations sur le InnoDB structures physiques peut être trouvé ici. Selon que vous utilisez l'Antilope ou le Barracuda format de fichier, vous vous retrouvez avec la "toute l'information est une ligne physique" ou "pool de mémoire tampon" situation semblable à la MyISAM distinction entre statique et dynamique.
Dans SQL Server, la limite n'affecte pas la façon dont les données sont stockées sur le disque. Ce qu'il fournit, cependant, est une contrainte pour gratuit. Si vous, en tant que concepteur de base de données, ne veulent jusqu'à 10 caractères stockés, vous avez empêché quelqu'un de stocker un roman à la place.
Encore une fois, pour SQL Server, presque certainement pas ce que vous voulez. Dans la plupart des cas, si vous ne spécifiez pas de limite, vous obtenez un
varchar(1)
(sûrement le plus inutile de type de données jamais conçu). Parfois, c'est unvarchar(30)
.Dans Oracle, Varchar s'étend de la taille en fonction de son utilisation, juste à l'endroit où vous définissez la limite. Cela signifie que, en effet, un varchar(10) varchar(100) contenant 2 caractères, utilisez le même espace (ce qui est différent pour un char, qui utilise toujours le plein espace alloué).