Comprimento máximo de caracteres UUID

115

Estamos usando UUID como chave primária para nosso banco de dados oracle e tentando determinar um comprimento máximo de caracteres apropriado para o VARCHAR. Aparentemente, são 36 caracteres, mas notamos UUID'S gerados que são mais longos do que isso - até 60 caracteres de comprimento. Alguém conhece um comprimento máximo de caracteres adequado para UUID?

user1753862
fonte
2
Como um UUID é um número de 128 bits, estou muito curioso para ver qual codificação o converteria em uma string de 60 caracteres. Parece uma codificação extremamente pobre ou algum outro problema não percebido para mim.
fvu
1
Qual é o seu RDBMS? O MS SQL tem um tipo dedicado para UUIDs e outros podem simplesmente armazenar os bytes. Há algum motivo para você querer armazená-los como VARCHARs?
@ user565869 armazená-los como bytes são terríveis para qualquer tipo de inspeção manual
Enerccio

Respostas:

171

A seção 3 do RFC4122 fornece a definição formal de representações de string UUID. Tem 36 caracteres (32 dígitos hexadecimais + 4 travessões).

Parece que você precisa descobrir de onde vêm os IDs de 60 caracteres inválidos e decidir 1) se deseja aceitá-los e 2) qual o comprimento máximo desses IDs com base em qualquer API usada para gerá-los.

broofa
fonte
64

Esse é o tipo de campo perfeito para definir como CHAR 36, aliás, não VARCHAR 36, pois cada valor terá exatamente o mesmo comprimento. E você usará menos espaço de armazenamento, já que não precisa armazenar o comprimento dos dados para cada valor, apenas o valor.

apotek
fonte
9
CHAR pode usar mais espaço do que VARCHAR se seu conjunto de caracteres na coluna for multibyte (consulte a parte inferior em stackoverflow.com/a/59686/1691446 )
David
7
Tenho certeza que UUIDv4 está usando apenas o charset latin-1 do UTF-8, caso em que isso não será afetado. Definitivamente, verifique se você está usando um conjunto de caracteres diferente.
Aaron_H
2
UUID em formato de string só pode usar este conjunto de caracteres (regex):, [0-9A-Fa-f-]que tem 23 octetos distintos em ASCII.
Cowbert
A RFC 4122 diz que os UUIDs têm 16 octetos ou 128 bits. Se você estiver usando mais do que tanto armazenamento, você os está codificando de forma ineficiente. Não há necessidade de codificar os travessões, por exemplo. Eles não adicionam nenhuma informação.
Trenton
4
@Trenton existe uma compensação entre eficiência de armazenamento e facilidade de uso. Pode-se armazenar UUIDs como BINÁRIO (16) para eficiência máxima de armazenamento, mas alguém olhando sobre o banco de dados não verá a representação canônica, e uma linguagem de programação pode ter apenas um meio de criar um objeto UUID a partir da representação canônica / string, ou não ter um tipo de objeto UUID; o UUID pode ser armazenado na forma de string em um arquivo, tornando a comparação com a forma binária complicada, etc.
TaylanUB
7

Atualmente, a maioria dos bancos de dados tem um tipo de UUID nativo para facilitar o trabalho com eles. Se o seu não, eles são apenas números de 128 bits, então você pode usar BINARY (16), e se você precisa do formato de texto frequentemente, por exemplo, para solução de problemas, então adicione uma coluna calculada para gerá-lo automaticamente a partir da coluna binária . Não há um bom motivo para armazenar o formato de texto (muito maior).

StephenS
fonte