Mysql
 sql >> Datenbank >  >> RDS >> Mysql

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

Also als Antwort auf Kommentare. Der korrekte Weg, eine 36-Zeichen-UUID als Binary(16) zu speichern, besteht darin, die Einfügung folgendermaßen durchzuführen:

INSERT INTO sometable (UUID) VALUES
       (UNHEX(REPLACE("3f06af63-a93c-11e4-9797-00505690773f", "-","")))

UNHEX weil eine UUID bereits ein hexadezimaler Wert ist. Wir trimmen (REPLACE ) die Bindestriche in der Anweisung, um die Länge auf 32 Zeichen zu reduzieren (unsere 16 Bytes werden als HEX dargestellt). ). Sie können dies natürlich jederzeit vor dem Speichern tun, damit es nicht von der Datenbank verarbeitet werden muss.

Sie können die UUID wie folgt abrufen:

SELECT HEX(UUID) FROM sometable;

Nur für den Fall, dass jemand auf diesen Thread stößt und sich nicht sicher ist, wie das funktioniert.

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

SELECT * FROM sometable WHERE UUID = UNHEX('3f06af63a93c11e4979700505690773f');

oder wörtliche Schreibweise (wie von Alexis Wilke erwähnt):

SELECT * FROM sometable WHERE UUID = 0x3f06af63a93c11e4979700505690773f;

Und NICHT HEX() in der Spalte:

SELECT * FROM sometable WHERE HEX(UUID) = '3f06af63a93c11e4979700505690773f';

Die letzte Lösung erfordert, obwohl sie funktioniert, dass MySQL HEX es alle UUIDs, bevor es feststellen kann, welche Zeilen übereinstimmen. Es ist sehr ineffizient.

Bearbeiten:Wenn Sie MySQL 8 verwenden, sollten Sie sich die UUID-Funktionen ansehen, die in der Antwort von SlyDave erwähnt werden. Diese Antwort ist immer noch richtig, optimiert jedoch nicht die UUID-Indizes, die mit diesen Funktionen nativ durchgeführt werden können. Wenn Sie auf