Einfügen und Auswählen von UUIDs als Binärdatei (16)

7

Ich verstehe nicht warum

%Vor%

Gibt etwas wie folgt zurück:

%Vor%

Aber wenn ich es in ein binäres Feld (16) (die UUID () -Funktion) mit zB einem BEFORE INSERT-Trigger einfüge und eine Auswahl ausführe, wird etwas wie folgt zurückgegeben:

%Vor%

Beachten Sie, dass diese beiden UUIDs nicht dieselben Daten sind.

Ich realisiere binäre und eine UUID-Zeichenfolge sieht nicht identisch aus, aber sollten die ausgewählten Daten nicht mindestens genauso lang sein? Sonst wie kann es möglicherweise gleichermaßen wahrscheinlich einzigartig sein?

Ist es besser, es als char (36) zu speichern? Ich brauche es nur, um doppelte Einfügungen zu vermeiden. Es wird niemals für Joins ausgewählt oder verwendet.

BEARBEITEN:

vor dem Trigger wäre wie folgt:

%Vor%     
nickdnk 31.01.2015, 11:36
quelle

3 Antworten

26

Also als Antwort auf Kommentare. Die richtige Methode zum Speichern einer UUID mit 36 ​​Zeichen als Binärwert (16) besteht darin, die Einfügung auf folgende Weise auszuführen:

%Vor%

UNHEX , weil eine UUID bereits ein Hexadezimalwert ist. Wir schneiden ( REPLACE ) die Bindestriche in der Anweisung, um die Länge auf 32 ASCII-Zeichen zu reduzieren (unsere 16 Bytes werden als HEX dargestellt). Sie können dies jederzeit tun, bevor Sie es speichern, damit es nicht von der Datenbank verarbeitet werden muss.

Sie können die UUID wie folgt abrufen:

%Vor%

Für den Fall, dass jemand auf diesen Thread stößt und unsicher ist, wie das funktioniert.

Und denken Sie daran: Wenn Sie eine Zeile mit der UUID auswählen, verwenden Sie UNHEX() für die Bedingung :

%Vor%

Und nicht HEX() in der Spalte:

%Vor%

Die zweite Lösung erfordert, solange sie funktioniert, daß MySQL% alle UUIDs mitteilt, bevor sie bestimmen kann, welche Zeilen übereinstimmen. Es ist sehr ineffizient.

    
nickdnk 31.01.2015, 13:35
quelle
6

Ab MySQL 8 können Sie zwei neue UUID-Funktionen verwenden:

  • BIN_TO_UUID

    %Vor%
  • UUID_TO_BIN

    %Vor%

Diese Methode unterstützt auch das Neuanordnen der Zeitkomponente der UUID, um die Indizierungsleistung zu verbessern (indem Sie sie chronologisch anordnen). Setzen Sie das zweite Argument einfach auf "True" - dies funktioniert nur für UUID1.

Wenn Sie das Flag true on UUID_TO_BIN für die Indizierung verwenden (empfohlen), müssen Sie es auch auf BIN_TO_UUID setzen, andernfalls wird es nicht korrekt zurückkonvertiert.

Weitere Informationen finden Sie in der Dokumentation.

SlyDave 19.07.2017 09:46
quelle
0

Ich verwende MariaDB, so dass BIN_TO_UUID functions family nicht existiert. Es gelang mir trotzdem, die entsprechenden Werte zu erhalten.

bin - & gt; hex

Hier ist uuid der binäre (16) Wert einer Uuid; Sie verwenden den folgenden Wert, um eine lesbare Version auszuwählen.

%Vor%

hex - & gt; bin

Hier ist cc6e6d97-5501-11e7-b2cb-ceedca613421 eine lesbare Version einer UUID, und Sie suchen nach dem Wert in einer WHERE-Klausel.

%Vor%

Prost

    
Alain Tiemblo 22.03.2018 15:05
quelle

Tags und Links