Longitud máxima de caracteres de UUID

115

Estamos utilizando UUID como clave principal para nuestra base de datos de Oracle y estamos tratando de determinar una longitud máxima de caracteres adecuada para el VARCHAR. Aparentemente, son 36 caracteres, pero hemos notado que se generan UUID que son más largos que esto, hasta 60 caracteres de longitud. ¿Alguien sabe una longitud máxima de caracteres adecuada para UUID?

usuario1753862
fuente
2
Como un UUID es un número de 128 bits, tengo mucha curiosidad por ver qué codificación lo convertiría en una cadena de 60 caracteres. Me parece que la codificación es extremadamente pobre o algún otro problema sin resolver.
fvu
1
¿Cuál es tu RDBMS? MS SQL tiene un tipo dedicado para UUID, y otros simplemente pueden almacenar los bytes. ¿Hay alguna razón por la que desee almacenarlos como VARCHARcorreos electrónicos?
@ user565869 almacenarlos como bytes es terrible para cualquier tipo de inspección manual
Enerccio

Respuestas:

171

La sección 3 de RFC4122 proporciona la definición formal de representaciones de cadenas UUID. Tiene 36 caracteres (32 dígitos hexadecimales + 4 guiones).

Parece que necesita averiguar de dónde provienen los ID de 60 caracteres no válidos y decidir 1) si desea aceptarlos y 2) cuál podría ser la longitud máxima de esos ID en función de la API que se use para generarlos.

broofa
fuente
64

Este es el tipo de campo perfecto para definir como CHAR 36, por cierto, no VARCHAR 36, ya que cada valor tendrá exactamente la misma longitud. Y utilizará menos espacio de almacenamiento, ya que no necesita almacenar la longitud de los datos para cada valor, solo el valor.

apotek
fuente
9
CHAR puede usar más espacio que VARCHAR si su juego de caracteres en la columna es de varios bytes (vea la parte inferior en stackoverflow.com/a/59686/1691446 )
David
7
Bastante seguro de que UUIDv4 solo está usando el conjunto de caracteres latin-1 de UTF-8, en cuyo caso esto no se verá afectado. Sin embargo, definitivamente verifique si está usando un juego de caracteres diferente.
Aaron_H
2
UUID en formato de cadena solo puede usar este conjunto de caracteres (regex):, [0-9A-Fa-f-]que son 23 octetos distintos en ASCII.
Cowbert
RFC 4122 dice que los UUID son 16 octetos o 128 bits. Si está usando más que esa cantidad de almacenamiento, los está codificando de manera ineficiente. No es necesario codificar los guiones, por ejemplo. No agregan información.
Trenton
4
@Trenton existe un compromiso entre la eficiencia del almacenamiento y la facilidad de uso. Uno podría almacenar UUID como BINARIO (16) para una máxima eficiencia de almacenamiento, pero alguien que mire la base de datos no vería la representación canónica, y un lenguaje de programación solo puede tener un medio para crear un objeto UUID a partir de la representación canónica / de cadena, o no tener un tipo de objeto UUID en absoluto; el UUID puede almacenarse en forma de cadena en un archivo, lo que hace que la comparación con la forma binaria sea engorrosa, etc.
TaylanUB
7

La mayoría de las bases de datos tienen un tipo de UUID nativo en estos días para facilitar el trabajo con ellas. Si el suyo no lo hace, son solo números de 128 bits, por lo que puede usar BINARY (16), y si necesita el formato de texto con frecuencia, por ejemplo, para solucionar problemas, agregue una columna calculada para generarla automáticamente a partir de la columna binaria. . No hay una buena razón para almacenar el formato de texto (mucho más grande).

StephenS
fuente