Longueur maximale des caractères UUID

115

Nous utilisons UUID comme clé primaire pour out oracle DB et essayons de déterminer une longueur de caractère maximale appropriée pour le VARCHAR. Apparemment, il s'agit de 36 caractères, mais nous avons remarqué des UUID générés qui sont plus longs que cela - jusqu'à 60 caractères de longueur. Quelqu'un connaît-il une longueur de caractères maximale appropriée pour l'UUID?

user1753862
la source
2
Comme un UUID est un nombre de 128 bits, je suis vraiment curieux de voir quel codage le convertirait en une chaîne de 60 caractères. Cela me semble être un encodage extrêmement médiocre ou un autre problème non résolu.
fvu
1
Quel est votre SGBDR? MS SQL a un type dédié pour les UUID, et d'autres peuvent simplement stocker les octets. Y a-t-il une raison pour laquelle vous souhaitez les stocker en tant que VARCHARs?
@ user565869 les stocker sous forme d'octets est terrible pour tout type d'inspection manuelle
Enerccio

Réponses:

171

La section 3 de la RFC4122 fournit la définition formelle des représentations sous forme de chaîne UUID. C'est 36 caractères (32 chiffres hexadécimaux + 4 tirets).

On dirait que vous devez déterminer d'où proviennent les ID non valides de 60 caractères et décider 1) si vous voulez les accepter, et 2) quelle peut être la longueur maximale de ces ID en fonction de l'API utilisée pour les générer.

Broofa
la source
64

C'est le type parfait de champ à définir comme CHAR 36, d'ailleurs, pas VARCHAR 36, puisque chaque valeur aura exactement la même longueur. Et vous utiliserez moins d'espace de stockage, car vous n'avez pas besoin de stocker la longueur des données pour chaque valeur, juste la valeur.

apotek
la source
9
CHAR peut utiliser plus d'espace que VARCHAR si votre jeu de caractères sur la colonne est multi-octets (voir la partie inférieure sur stackoverflow.com/a/59686/1691446 )
David
7
À peu près sûr, UUIDv4 n'utilise que le jeu de caractères latin-1 de UTF-8, auquel cas cela ne sera pas affecté. Vérifiez certainement si vous utilisez un jeu de caractères différent.
Aaron_H
2
L'UUID au format chaîne ne peut utiliser que cet ensemble de caractères (regex):, [0-9A-Fa-f-]qui est de 23 octets distincts en ASCII.
cowbert
La RFC 4122 indique que les UUID sont de 16 octets ou 128 bits. Si vous utilisez plus de stockage que cela, vous les encodez de manière inefficace. Pas besoin d'encoder les tirets, par exemple. Ils n'ajoutent aucune information.
Trenton
4
@Trenton il y a un compromis entre l'efficacité du stockage et la convivialité. On pourrait stocker les UUID en tant que BINARY (16) pour une efficacité de stockage maximale, mais quelqu'un qui regarde la base de données ne verrait pas la représentation canonique, et un langage de programmation peut seulement avoir un moyen de créer un objet UUID à partir de la représentation canonique / chaîne, ou non avoir un type d'objet UUID du tout; l'UUID peut être stocké sous forme de chaîne dans un fichier, ce qui rend la comparaison avec la forme binaire fastidieuse, etc.
TaylanUB
7

De nos jours, la plupart des bases de données ont un type UUID natif pour faciliter leur utilisation. Si ce n'est pas le cas, ce ne sont que des nombres de 128 bits, vous pouvez donc utiliser BINARY (16), et si vous avez besoin du format de texte fréquemment, par exemple pour le dépannage, ajoutez une colonne calculée pour la générer automatiquement à partir de la colonne binaire . Il n'y a aucune bonne raison de stocker le formulaire de texte (beaucoup plus grand).

StephenS
la source