246 votes

Pourquoi, historiquement, les gens utilisent-ils 255 et non 256 pour les magnitudes des champs de la base de données ?

On voit souvent des champs de base de données définis pour avoir une magnitude de 255 caractères. Quelle est la raison traditionnelle / historique de ce choix ? Je suppose que c'est lié à la pagination, aux limites de mémoire et aux performances, mais la distinction entre 255 et 256 m'a toujours dérouté.

varchar(255)

Considérant qu'il s'agit d'une capacité ou d'une magnitude, pas un indexeur , pourquoi le 255 est préféré au 256 ? Un octet est-il réservé à un usage quelconque (terminateur ou null ou autre) ?

On peut supposer que varchar(0) est un non-sens (a une capacité nulle) ? Dans ce cas, 2^8 de l'espace devrait être 256 sûrement ?

Y a-t-il d'autres magnitudes qui offrent des avantages en matière de performance ? Par exemple, varchar(512) est-il moins performant que varchar(511) ou varchar(510) ?

Cette valeur est-elle la même pour toutes les bases de données de relations, anciennes et nouvelles ?

clause de non-responsabilité - Je suis un développeur, pas un DBA. J'utilise les tailles et les types de champs qui conviennent à ma logique d'entreprise lorsque celle-ci est connue, mais j'aimerais connaître le nom de l'entreprise. historique la raison de cette préférence, même si elle n'est plus pertinente (mais encore plus si elle l'est toujours).

Editar:

Merci pour les réponses, il semble y avoir un certain consensus sur le fait qu'un octet est utilisé pour stocker la taille, mais cela ne règle pas définitivement la question dans mon esprit.

Si les métadonnées (longueur de la chaîne de caractères) sont stockées dans la même mémoire/disque contigu, cela a un certain sens. Un octet de métadonnées et 255 octets de données de chaîne de caractères se complèteraient très bien et tiendraient dans 256 octets contigus de mémoire, ce qui est sans doute bien ordonné.

Mais... Si les métadonnées (longueur de la chaîne) sont stockées séparément des données réelles de la chaîne (dans une table principale peut-être), alors limiter la longueur des données de la chaîne par un octet, juste parce qu'il est plus facile de stocker seulement un entier d'un octet de métadonnées semble un peu étrange.

Dans les deux cas, il s'agit d'une subtilité qui dépend probablement de l'implémentation de la BD. La pratique de l'utilisation de 255 semble assez répandue, donc quelqu'un, quelque part, a dû plaider en sa faveur au début, quelqu'un peut-il se souvenir de ce qu'était/est ce cas ? Les programmeurs n'adoptent pas une nouvelle pratique sans raison, et celle-ci a dû être nouvelle à un moment donné.

6 votes

Parce que le nombre de caractères va de 0 à N-1. Donc 256 caractères seront déclarés varchar(255). Sauf erreur de ma part.

4 votes

Peut-être parce que les informaticiens commencent à compter avec 0, et non 1 ;) ?

0 votes

Je pense que ça a à voir avec les programmeurs de la vieille école, je ne me souviens même pas pourquoi nous l'avons fait.

207voto

Greg Hewgill Points 356191

Avec une longueur maximale de 255 caractères, le SGBD peut choisir d'utiliser un seul octet pour indiquer la longueur des données du champ. Si la limite était de 256 ou plus, deux octets seraient nécessaires.

Une valeur de longueur zéro est certainement valable pour varchar (sauf contrainte contraire). La plupart des systèmes traitent une telle chaîne vide comme distincte de NULL, mais certains systèmes (notamment Oracle) traitent une chaîne vide de manière identique à NULL. Pour les systèmes où une chaîne vide n'est pas NULL, un bit supplémentaire quelque part dans la ligne serait nécessaire pour indiquer si la valeur doit être considérée comme NULL ou non.

Comme vous le notez, il s'agit d'une optimisation historique qui n'est probablement pas pertinente pour la plupart des systèmes actuels.

0 votes

Réserver un octet pour la longueur est logique, mais en ce qui concerne votre deuxième paragraphe, on peut supposer qu'une /valeur/ de longueur zéro est valide, mais une /capacité/ de longueur zéro est-elle valide ?

1 votes

@Andrew : Je viens d'essayer et PostgreSQL rejette. varchar(0) . Ce n'est probablement pas très utile parce que la valeur ne peut être que deux choses, la chaîne vide ou NULL, et donc vous pourriez tout aussi bien utiliser un fichier bit pour ça.

0 votes

Est-il donc vrai de supposer que les métadonnées de capacité sont stockées dans le même bloc contigu que les données elles-mêmes, et qu'il y a donc un avantage pour la base de données à garder le total de ces deux éléments (données et métadonnées) dans une page (vraisemblablement 256 octets) ?

43voto

CuriousPanda Points 990

255 était le limite varchar dans mySQL4 et les versions antérieures.

Aussi 255 chars + Null terminator = 256

Ou un descripteur d'une longueur de 1 octet donnant une gamme possible de 0 à 255 caractères.

0 votes

Et lire dans char foo[256] est important car la gestion de la mémoire aime les puissances de 2. voir : stackoverflow.com/questions/3190146/ Attribution du site char foo[257] va soit fragmenter la mémoire, soit occuper 512 octets.

5 votes

Varchar ne stocke-t-il pas la longueur de la chaîne, et n'a donc pas besoin d'un terminateur nul ?

25voto

Amber Points 159296

255 est la plus grande valeur numérique qui peut être stockée dans un entier non signé d'un octet (en supposant des octets de 8 bits) - par conséquent, les applications qui stockent la longueur d'une chaîne de caractères dans un but quelconque préféreront 255 à 256 car cela signifie qu'elles ne doivent allouer qu'un seul octet pour la variable "size".

20voto

Anil Shinde Points 71

Extrait du manuel MySQL :

Type de données :
VARCHAR(M), VARBINARY(M)

Stockage requis :
L + 1 octets si les valeurs de la colonne nécessitent de 0 à 255 octets, L + 2 octets si les valeurs peuvent nécessiter plus de 255 octets.

Comprendre et faire un choix.

1 votes

Oui, mais M represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value. dev.mysql.com/doc/refman/5.7/fr/storage-requirements.html

8voto

MarkJ Points 21438

Une longueur maximale de 255 permet au moteur de la base de données d'utiliser seulement 1 octet pour stocker la longueur de chaque champ. Vous avez raison de dire qu'un octet d'espace vous permet de stocker 2^8=256 valeurs distinctes pour la longueur de la chaîne.

Mais si vous autorisez le champ à stocker des chaînes de texte de longueur nulle, vous devez être en mesure de stocker zéro dans la longueur. Vous pouvez donc autoriser 256 valeurs de longueur distinctes, en commençant par zéro : 0-255.

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