207 votes

Y a-t-il une bonne raison pour laquelle je vois VARCHAR(255) utilisé si souvent (plutôt qu'une autre longueur) ?

Dans de nombreux cours, livres et emplois, j'ai vu des champs de texte définis comme VARCHAR(255) comme une sorte de valeur par défaut pour les textes "courts". Y a-t-il une bonne raison pour laquelle une longueur de 255 est choisie si souvent, autre que le fait d'être un beau chiffre rond ? S'agit-il d'une survivance d'un temps passé où il y avait une bonne raison (qu'elle soit ou non valable aujourd'hui) ?

Je réalise, bien sûr, qu'une limite plus stricte serait plus idéale, si vous connaissez d'une manière ou d'une autre la longueur maximale de la corde. Mais si vous utilisez VARCHAR(255), cela indique probablement que vous ne connaissez pas la longueur maximale, mais seulement qu'il s'agit d'une chaîne "courte".


Note : J'ai trouvé cette question ( varchar(255) v tinyblob v tinytext ), ce qui signifie que VARCHAR( n ) exige n +1 octets de stockage pour n <=255, n +2 octets de stockage pour n >255. Est-ce la seule raison ? Cela semble un peu arbitraire, puisque vous n'économisez que deux octets par rapport à VARCHAR(256), et que vous pourriez tout aussi bien économiser deux autres octets en le déclarant VARCHAR(253).

205voto

Robert Harvey Points 103562

255 est utilisé parce que c'est le plus grand nombre de caractères qui peuvent être comptés avec un nombre de 8 bits. Cela permet de maximiser l'utilisation du nombre de 8 bits, sans exiger frivolement un autre octet entier pour compter les caractères au-dessus de 255.

Lorsqu'il est utilisé de cette manière, VarChar n'utilise que le nombre d'octets + 1 pour stocker votre texte. Vous pouvez donc tout aussi bien le définir sur 255, à moins que vous ne souhaitiez fixer une limite stricte (comme 50) au nombre de caractères du champ.

112 votes

J'aime cette phrase : "nécessitant frivolement un autre octet entier". =)

7 votes

Cela est-il vrai pour les bases de données où les variables sont en UTF-8 ?

2 votes

@antak : Dans MySQL, en utilisant InnoDB, toute colonne clé ne peut pas être plus grande que 767 octets. Si une colonne VARCHAR est UTF8 (ce qui signifie que chaque caractère peut prendre jusqu'à 3 octets), la longueur maximale autorisée de la colonne est floor(767/3) = 255. Je suppose que "767" a été choisi exactement pour cette raison.

128voto

chaos Points 69029

Historiquement, 255 caractères ont souvent été la longueur maximale d'un message de type VARCHAR dans certains SGBD, et il s'avère parfois être le maximum effectif si vous voulez utiliser UTF-8 et avoir la colonne indexée (à cause des limitations de longueur d'index).

0 votes

Ms access propose cette longueur par défaut, par exemple

0 votes

"s'avère être la longueur maximale effective d'un varchar ..." qu'est-ce qui justifie cela ? Si vous aviez laissé de côté le mot "efficace", je l'aurais acheté. Avec ce mot, vous sous-entendez que dans les SGBD auxquels vous faites référence, vous pouvez avoir des colonnes plus grandes, mais qu'elles sont inefficaces. ce n'est pas vrai. - Je ne suis même pas sûr de ce que cela signifie.

4 votes

@CharlesBretana : si vous lisez la suite de la phrase que vous avez citée, vous trouverez l'explication exacte que vous demandez.

24voto

Charles Bretana Points 59899

Probablement parce que SQL Server et Sybase (pour n'en nommer que deux que je connais bien) avaient l'habitude de limiter à 255 le nombre de caractères dans un fichier de type VARCHAR colonne. Pour SQL Server, cela a changé dans la version 7 en 1996/1997 environ... mais les vieilles habitudes ont parfois la vie dure.

9 votes

+1 pour citer des BD et des versions spécifiques. Et "Les vieilles habitudes ont la vie dure" est probablement la réponse la plus vraie de toutes.

22voto

MusiGenesis Points 49273

Je vais répondre à la question littérale : pas de il n'y a pas de bonne raison pour laquelle vous voyez VARCHAR(255) utilisé si souvent (il y a en effet raisons (comme indiqué dans les autres réponses, mais pas les bonnes). Vous ne trouverez pas beaucoup d'exemples de projets qui ont échoué de manière catastrophique parce que l'architecte a choisi VARCHAR(300) au lieu de VARCHAR(255). Ce problème serait presque totalement insignifiant même si vous parliez de CHAR au lieu de VARCHAR.

1 votes

Un octet sur 255, c'est 0,4 %. Parfois, vous vous souciez de la dernière moitié du pourcentage. Parfois, vous ne le faites pas. Si vos coûts d'hébergement et de perforation se chiffrent en dizaines de dollars, vous ne vous en souciez probablement pas. S'ils se chiffrent en millions, c'est probablement le cas.

3 votes

EdwardBrey : si la loi de Moore est toujours d'actualité, ma réponse est 16 fois plus valable que lorsque je l'ai écrite.

1 votes

À moins que nous ayons découvert 16 fois plus de façons dont les ordinateurs peuvent nous aider. La vitesse est toujours une caractéristique.

9voto

Stefano Borini Points 36904

Note : J'ai trouvé cette question ( varchar(255) v tinyblob v tinytext ), ce qui signifie que VARCHAR( n ) exige n +1 octets de stockage pour n <=255, n +2 octets de stockage pour n >255. Est-ce la seule raison ? Cela semble un peu arbitraire, puisque vous n'économisez que deux octets par rapport à VARCHAR(256), et que vous pourriez tout aussi bien économiser deux autres octets en le déclarant VARCHAR(253).

Non. Vous n'économisez pas deux octets en déclarant 253. L'implémentation du varchar est très probablement un compteur de longueur et un tableau non terminé de longueur variable. Cela signifie que si vous stockez "hello" dans un varchar(255), vous occuperez 6 octets : un octet pour la longueur (le nombre 5) et 5 octets pour les cinq lettres.

3 votes

Cette affirmation n'est pas vraie pour toutes les bases de données. De nombreuses bases de données utilisent des champs varchar de taille donnée dans les tables afin de ne pas avoir à déplacer les lignes lorsque ce champ est modifié pour une ligne.

0 votes

Oui, vous avez raison. Cela dépend de l'implémentation. Vous devez vérifier le manuel du fournisseur pour voir ce qu'il en est.

4 votes

C'est peut-être permis, mais la mise en œuvre VARCHAR de cette façon, cela va à l'encontre de tout point de l'utilisation VARCHAR au lieu de CHAR .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X