web-dev-qa-db-fra.com

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

Vous voyez souvent des champs de base de données configurés pour avoir une magnitude de 255 caractères. Quelle en est la raison traditionnelle/historique? Je suppose que cela a quelque chose à voir avec les limites de pagination/mémoire et les 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, et non un indexeur , pourquoi préférer 255 à 256? Un octet est-il réservé à certains but (terminateur ou null ou quelque chose)?

Vraisemblablement varchar (0) est un non-sens (a une capacité nulle)? Dans quel cas 2 ^ 8 de l'espace devrait être 256 sûrement?

Existe-t-il d'autres valeurs offrant des avantages en termes de performances? 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?

disclaimer - Je suis un développeur et non un administrateur de base de données. J'utilise des tailles de champ et des types qui correspondent à ma logique métier, mais je souhaiterais connaître le historique pour cette préférence, même si elle n’est plus pertinente (mais plus encore si elle est toujours pertinente).

Modifier:

Merci pour les réponses, il semble y avoir un 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 chaîne) sont stockées dans la même mémoire/disque contigu, cela a du sens. Un octet de métadonnées et 255 octets de données de chaîne se satisferaient très bien et s’intégreraient dans 256 octets de stockage contigus, ce qui est sans doute propre et ordonné.

Mais ... Si les métadonnées (longueur de chaîne) sont stockées séparément des données de chaîne réelles (dans une table principale, par exemple), il faut alors contraindre la longueur des données de chaîne à un octet, simplement parce qu'il est plus facile de stocker un entier de 1 octet. des métadonnées semble un peu étrange.

Dans les deux cas, il semblerait que ce soit une subtilité qui dépend probablement de la mise en œuvre de la base de données. La pratique de l'utilisation de 255 semble assez répandue, donc quelqu'un, quelque part, a du faire valoir un bon argument au début. Quelqu'un peut-il se rappeler quel était ce cas? Les programmeurs n'adopteront aucune nouvelle pratique sans raison, et cela a dû être nouveau une fois.

175
Andrew M

Avec une longueur maximale de 255 caractères, le SGBD peut choisir d'utiliser un seul octet pour indiquer la longueur des données dans le 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 data (sauf si contraint autrement). La plupart des systèmes traitent une telle chaîne vide de manière distincte de NULL, mais certains systèmes (notamment Oracle) traitent une chaîne vide de la même manière que 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 constatez, il s’agit d’une optimisation historique qui n’est probablement pas pertinente pour la plupart des systèmes actuels.

157
Greg Hewgill

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

Également 255 caractères + terminateur nul = 256

Ou un descripteur de longueur sur 1 octet donne une plage possible de 0 à 255 caractères

31
RedPandaCurios

255 est la plus grande valeur numérique pouvant être stockée dans un entier non signé sur un octet (en supposant des octets de 8 bits) - par conséquent, les applications qui stockent la longueur d'une chaîne pour une raison quelconque préféreraient 255 plutôt que 256, car cela signifie qu'elles doivent seulement allouer 1 octet pour la variable "taille".

18
Amber

Depuis le manuel MySQL:

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

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

Comprendre et faire un choix.

14
Anil Shinde

255 est la valeur maximale d'un entier de 8 bits: 11111111 = 255.

13
remi bourgarel

Une longueur maximale de 255 permet au moteur de base de données d'utiliser un seul octet pour stocker la longueur de chaque champ. Vous avez raison, 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 pouvoir stocker zéro dans la longueur. Ainsi, vous pouvez autoriser 256 valeurs de longueur distinctes, en commençant à zéro: 0-255.

7
MarkJ

Les varchars sont souvent implémentés en tant que chaînes Pascal: conservant la longueur réelle dans l'octet # 0. La longueur a donc été liée à 255. (La valeur d'un octet varie de 0 à 255.)

6
Vlad

<<

Rappelé les principes de base du stockage de bits/octets, il nécessite un octet pour stocker des nombres entiers inférieurs à 256 et deux octets pour tout nombre entier compris entre 256 et 65536. Par conséquent, le même espace (deux octets) est nécessaire pour stocker 511 ou 512 ou 65535 .... Il est donc clair que l'argument mentionné dans la discussion ci-dessus est N/A pour varchar (512) ou varchar (511).

5
Balaji Katika

8 bits non signés = 256 octets

255 caractères + octet 0 pour la longueur

4
gbn

Auparavant, toutes les chaînes de caractères nécessitaient un terminateur NUL, ou "backslash-zero". Les bases de données mises à jour n'ont pas cela. C'était "255 caractères de texte" avec un "\ 0" ajouté automatiquement à la fin pour que le système sache où la chaîne se termine. Si vous disiez VARCHAR (256), cela donnerait 257 et vous seriez dans le registre suivant pour un caractère. Gaspilleur. C'est pourquoi tout était VARCHAR (255) et VARCHAR (31). Par habitude, le 255 semble être resté, mais le 31 est devenu le 32 et le 511 est devenu le 512. Cette partie est bizarre. Il est difficile de me faire écrire VARCHAR (256).

3
Greg

Je pense que cela pourrait répondre à votre question. On dirait que c'était la limite maximale de varchar dans les systèmes précédents. Je l'ai enlevé d'une autre question de stackoverflow.

Il est difficile de savoir quelle est la plus longue adresse postale, ce qui explique pourquoi de nombreuses personnes choisissent un VARCHAR long qui est certainement plus long que n'importe quelle adresse. Et 255 est habituel car il peut avoir été la longueur maximale d'un VARCHAR dans certaines bases de données à la nuit des temps (ainsi que PostgreSQL jusqu'à tout récemment).

Y a-t-il des inconvénients à utiliser un varchar générique (255) pour tous les champs textuels?

0
Neo M Hacker

Les données sont sauvegardées en mémoire dans le système binaire et 0 et 1 sont des chiffres binaires. Le plus grand nombre binaire pouvant contenir 1 octet (8 bits) est 11111111 qui est converti en 255 décimal.

0
Ejaz