Das einfügen und auswählen von UUIDs als binary(16)
Ich verstehe nicht, warum
SELECT UUID();
Gibt so etwas wie:
3f06af63-a93c-11e4-9797-00505690773f
Aber wenn ich stecken Sie es in eine binary(16) - Feld (die UUID () - Funktion), die beispielsweise mit einem BEFORE-INSERT-trigger, und führen Sie eine auswählen, es gibt so etwas wie:
0782ef48-a439-11
Beachten Sie, dass diese beiden UUIDs sind nicht die gleichen Daten.
Merke ich, binäre und eine UUID-Zeichenfolge nicht identisch Aussehen, aber sollte nicht die ausgewählten Daten mindestens genauso lange? Wie sonst kann es vielleicht sein, ebenso wahrscheinlich, einzigartig zu sein?
Ist es besser, um es zu speichern als char(36)? Ich brauche nur einzigartig zu sein, um zu verhindern, dass doppelte Einsätze. Es ist nie ausgewählt oder verwendet für joins.
EDIT:
before-trigger werden würde wie:
BEGIN
if NEW.UUID IS NULL THEN
NEW.UUID = UUID();
END IF
END
- Zeigen, wie Sie tun, die
INSERT
. BINARY(16)
können nur 16 Zeichen. So enthalten die ersten 16 Zeichen der UUID, die Sie speichern in ihm.- Nach stackoverflow.com/questions/10950202/... das ist nicht der Fall. Auch stackoverflow.com/questions/17726682/...
- Diese Antwort nutzt
UNHEX()
zu konvertieren, die UUID zu einer Nummer, die passen in 16 bytes. - Egal wie Sie es drehen, wäre das nicht, reduzieren Sie die Komplexität um rund 50% dann? Das hat mich sehr verwirrt.
- Ich verstehe nicht die Frage. Komplexität, was?
- Likelyness, dass die UUID ist einzigartig.
- dev.mysql.com/doc/refman/5.0/en/... erklärt, wie es sorgt, es ist einzigartig.
- Okay, wir reden völlig aneinander vorbei. Ich weiß, dass die erste UUID ist mehr oder weniger garantiert, einzigartig zu sein,aber wenn Sie Schnitt 50% der Daten, die es wohl nicht mehr. Also warum tun Menschen hex oder unhex eine UUID und eine Reduzierung der Länge von 50%? Das macht für mich keinen Sinn.
- Warum sind Sie Weg schneiden 50% der Daten? Wenn Sie
UNHEX()
alle 2-Zeichen wird ein byte des Ergebnisses, so wird es dann fit inBINARY(16)
. - Es gibt etwas, was ich einfach nicht verstehen, überhaupt über die hex, dann. Tut mir Leid.
- Hex-Ziffern
0
durchF
sind die zahlen0
durch15
im Dezimalsystem. Jede hex-Ziffer entspricht 4 bits, also 2 hex-Ziffern 8 bit, also 1 byte. - So richtig speichern Sie die UUID sollte ich entweder: A. Hex es zu verdichten, um 16 bytes, oder B. Speichern Sie es als char(36) statt?
- Ja, das ist richtig.
- Danke. Ich werde in diesem Blick dann.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, als Reaktion auf Kommentare. Die richtige Art und Weise der Speicherung einer 36-char UUID als binary(16) zum ausführen der insert-Anweisung in einer Weise wie:
UNHEX
da eine UUID ist schon ein verdammt Wert. Wir trimmen (REPLACE
) die Gedankenstriche in die Aussage zu bringen, die Länge bis zu 32 ASCII-Zeichen (16 bytes dargestellt alsHEX
). Sie können dies tun, an jedem Punkt vor der Speicherung, offensichtlich, also es muss nicht von der Datenbank behandelt.Können Sie abrufen der UUID wie diese:
Nur falls jemand auf diesen thread und ist unsicher, wie dies funktioniert.
Und denken Sie daran: Wenn Sie die Auswahl einer Zeile mit der UUID, verwenden
UNHEX()
auf den Zustand:Und nicht
HEX()
auf die Spalte:Die zweite Lösung, während es funktioniert, setzt Voraus, dass MySQL
HEX
es alle UUIDs, bevor es kann feststellen, welche Zeilen entsprechen. Es ist sehr ineffizient.Edit: Wenn du mit MySQL-8 sollten Sie einen Blick auf das UUID-Funktionen wie bereits erwähnt in SlyDave Antwort. Diese Antwort ist korrekt, aber es funktioniert nicht optimieren Sie den UUID-Indizes, die getan werden kann, die nativ mit diesen Funktionen.
Als MySQL-8 können Sie zwei neue UUID-Funktionen:
BIN_TO_UUID
UUID_TO_BIN
Diese Methode unterstützt auch die Neuordnung der Zeit-Komponente der uuid zur Verbesserung der Leistung bei der Indizierung (durch die Bestellung es chronologisch), legen Sie das zweite argument auf true - das funktioniert nur für UUID1.
Wenn Sie die
true
aufUUID_TO_BIN
flag für die Indizierung Leistung (empfohlen), müssen Sie auch legen Sie es aufBIN_TO_UUID
sonst wird es nicht zurück konvertieren, richtig.Finden Sie in der Dokumentation für weitere details.
Die anderen Antworten sind richtig. Die
UUID()
- Funktion gibt einen 36-Zeichenfolge und muss konvertiert werden mithilfe der dargestellten Funktionen (UNHEX()
oder, auf neueren PlattformenUUID_TO_BIN()
).Jedoch, wenn Sie Ihre eigene software erstellen Sie Ihre UUIDs, dann können Sie die Hexadezimal-Literal notation statt.
So würde ich die folgenden mit der MySQL -
UUID()
Funktion:Aber verwenden dieses in Fall, dass ich die Erstellung meiner eigenen UUIDs;
Können Sie ebenso Hexadezimal-Literale in Ihrer
WHERE
Klauseln:Diese werden schneller, wenn Sie nicht konvertieren Sie Ihre Daten in eine UUID-Zeichenfolge jedes mal.
Hinweis: die
'x'
im'0xaBc
groß-und Kleinschreibung. Die hexadezimalen Ziffern werden allerdings nicht an.Ich bin mit MariaDB so
BIN_TO_UUID
Funktionen der Familie gibt es nicht. Ich schaffte es, die entsprechenden Werte sowieso.bin -> hex
Hier
uuid
ist die binary(16) - Wert der uuid; verwenden Sie den Wert unten, um WÄHLEN Sie eine lesbare version davon.hex -> bin
Hier
cc6e6d97-5501-11e7-b2cb-ceedca613421
ist eine lesbare version der UUID, und verwenden Sie den Wert unten in einer WHERE-Klausel zu suchen.Cheers