UUID maximale Zeichenlänge


114

Wir verwenden UUID als Primärschlüssel für unsere Oracle-Datenbank und versuchen, eine geeignete maximale Zeichenlänge für VARCHAR zu ermitteln. Anscheinend sind dies 36 Zeichen, aber wir haben festgestellt, dass UUIDs generiert wurden, die länger sind - bis zu 60 Zeichen lang. Kennt jemand eine geeignete maximale Zeichenlänge für UUID?


2
Da eine UUID eine 128-Bit-Zahl ist, bin ich sehr gespannt, welche Codierung sie in eine Zeichenfolge mit 60 Zeichen umwandeln würde. Sieht für mich entweder nach einer extrem schlechten Codierung oder nach einem anderen, nicht behandelten Problem aus.
fvu

1
Was ist dein RDBMS? MS SQL hat einen dedizierten Typ für UUIDs, und andere können die Bytes einfach speichern. Gibt es einen Grund, warum Sie diese als VARCHARs speichern möchten ?

@ user565869 Speichern von ihnen als Bytes sind für jede Art von manueller Überprüfung schrecklich
Enerccio

Antworten:


171

Abschnitt 3 von RFC4122 enthält die formale Definition von UUID-Zeichenfolgendarstellungen. Es besteht aus 36 Zeichen (32 hexadezimale Ziffern + 4 Striche).

Klingt so, als müssten Sie herausfinden, woher die ungültigen 60-Zeichen-IDs stammen, und entscheiden, 1) ob Sie sie akzeptieren möchten und 2) wie hoch die maximale Länge dieser IDs sein kann, basierend auf der API, mit der sie generiert werden.


64

Dies ist die perfekte Art von Feld, um es übrigens als CHAR 36 und nicht als VARCHAR 36 zu definieren, da jeder Wert genau die gleiche Länge hat. Und Sie benötigen weniger Speicherplatz, da Sie nicht die Datenlänge für jeden Wert speichern müssen, sondern nur den Wert.


9
CHAR verwendet möglicherweise mehr Speicherplatz als VARCHAR, wenn Ihr Zeichensatz in der Spalte mehrbyteig ist (siehe unterer Teil auf stackoverflow.com/a/59686/1691446 )
David

7
Ziemlich sicher, dass UUIDv4 nur den Latin-1-Zeichensatz von UTF-8 verwendet. In diesem Fall ist dies nicht betroffen. Überprüfen Sie auf jeden Fall, ob Sie einen anderen Zeichensatz verwenden.
Aaron_H

2
Die UUID im Zeichenfolgenformat kann nur diesen Zeichensatz (Regex) verwenden: Dies [0-9A-Fa-f-]sind 23 verschiedene Oktette in ASCII.
Cowbert

Laut RFC 4122 sind UUIDs 16 Oktette oder 128 Bit. Wenn Sie mehr als so viel Speicher verwenden, codieren Sie diese ineffizient. Zum Beispiel müssen die Striche nicht codiert werden. Sie fügen keine Informationen hinzu.
Trenton

4
@Trenton gibt es einen Kompromiss zwischen Speichereffizienz und Benutzerfreundlichkeit. Man könnte UUIDs als BINARY (16) speichern, um maximale Speichereffizienz zu erzielen, aber jemand, der über die Datenbank schaut, würde die kanonische Darstellung nicht sehen, und eine Programmiersprache kann möglicherweise nur ein UUID-Objekt aus der kanonischen / Zeichenfolgendarstellung erstellen oder nicht überhaupt einen UUID-Objekttyp haben; Die UUID kann in Zeichenfolgenform in einer Datei gespeichert werden, was den Vergleich mit der Binärform umständlich macht usw.
TaylanUB

7

Die meisten Datenbanken haben heutzutage einen nativen UUID-Typ, um die Arbeit mit ihnen zu erleichtern. Wenn dies bei Ihnen nicht der Fall ist, handelt es sich nur um 128-Bit-Zahlen. Sie können also BINARY (16) verwenden. Wenn Sie das Textformat häufig benötigen, z. B. zur Fehlerbehebung, fügen Sie eine berechnete Spalte hinzu, um es automatisch aus der Binärspalte zu generieren . Es gibt keinen guten Grund, das (viel größere) Textformular zu speichern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.