Maksymalna długość znaków UUID

115

Używamy UUID jako klucza podstawowego dla out oracle DB i próbujemy określić odpowiednią maksymalną długość znaków dla VARCHAR. Wygląda na to, że jest to 36 znaków, ale zauważyliśmy wygenerowane UUID, które są dłuższe - do 60 znaków. Czy ktoś zna odpowiednią maksymalną długość znaków dla UUID?

user1753862
źródło
2
Ponieważ UUID to 128-bitowa liczba, jestem naprawdę ciekawa, jakie kodowanie przekształciłoby go w ciąg 60 znaków. Wygląda na to, że albo bardzo słabe kodowanie, albo jakiś inny, nierealny problem.
fvu
1
Jaki jest Twój RDBMS? MS SQL ma dedykowany typ dla UUID, a inni mogą po prostu przechowywać bajty. Czy jest jakiś powód, dla którego chcesz je zapisać jako VARCHARs?
@ user565869 przechowywanie ich jako bajtów jest okropne do jakiejkolwiek ręcznej kontroli
Enerccio

Odpowiedzi:

171

Sekcja 3 dokumentu RFC4122 zawiera formalną definicję reprezentacji ciągu UUID. Ma 36 znaków (32 cyfry szesnastkowe + 4 myślniki).

Wygląda na to, że musisz dowiedzieć się, skąd pochodzą nieprawidłowe 60-znakowe identyfikatory i zdecydować 1), czy chcesz je zaakceptować, oraz 2) jaka może być maksymalna długość tych identyfikatorów na podstawie dowolnego interfejsu API używanego do ich generowania.

broofa
źródło
64

Nawiasem mówiąc, jest to idealny rodzaj pola do zdefiniowania jako CHAR 36, a nie VARCHAR 36, ponieważ każda wartość będzie miała dokładnie taką samą długość. Zużyjesz mniej miejsca, ponieważ nie musisz przechowywać długości danych dla każdej wartości, tylko wartość.

apotek
źródło
9
CHAR może zajmować więcej miejsca niż VARCHAR, jeśli zestaw znaków w kolumnie jest wielobajtowy (patrz dolna część na stackoverflow.com/a/59686/1691446 )
David
7
Jestem całkiem pewien, że UUIDv4 używa tylko zestawu znaków latin-1 UTF-8, w takim przypadku nie będzie to miało wpływu. Zdecydowanie sprawdź, czy używasz innego zestawu znaków.
Aaron_H
2
Identyfikator UUID w formacie łańcucha może używać tylko tego zestawu znaków (wyrażenia regularnego):, [0-9A-Fa-f-]czyli 23 różnych oktetów w kodzie ASCII.
cowbert
RFC 4122 mówi, że identyfikatory UUID mają 16 oktetów lub 128 bitów. Jeśli używasz więcej niż tyle miejsca, kodujesz je nieefektywnie. Na przykład nie ma potrzeby kodowania myślników. Nie dodają żadnych informacji.
Trenton
4
@Trenton istnieje kompromis między wydajnością pamięci masowej a łatwością obsługi. Można by przechowywać identyfikatory UUID jako BINARY (16) dla maksymalnej wydajności przechowywania, ale ktoś przeglądający bazę danych nie widziałby reprezentacji kanonicznej, a język programowania może mieć tylko środki do tworzenia obiektu UUID z reprezentacji kanonicznej / łańcuchowej, lub nie mieć w ogóle typ obiektu UUID; UUID może być przechowywany w pliku w postaci ciągu znaków, co sprawia, że ​​porównanie z formą binarną jest uciążliwe itp.
TaylanUB,
7

Większość baz danych ma obecnie natywny typ UUID, aby ułatwić pracę z nimi. Jeśli nie, to tylko 128-bitowe liczby, więc możesz użyć BINARY (16), a jeśli często potrzebujesz formatu tekstowego, np. Do rozwiązywania problemów, dodaj kolumnę obliczeniową, aby wygenerować ją automatycznie z kolumny binarnej . Nie ma powodu, aby przechowywać (znacznie większy) formularz tekstowy.

StephenS
źródło