sql >> Databasteknik >  >> RDS >> Mysql

Infoga och välja UUID som binär(16)

Så, som ett svar på kommentarer. Det korrekta sättet att lagra en 36-teckens UUID som binär(16) är att utföra infogningen på ett sätt som:

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

UNHEX eftersom ett UUID redan är ett hexadecimalt värde. Vi trimmar (REPLACE ) strecken i satsen för att få ner längden till 32 tecken (våra 16 byte representerade som HEX ). Du kan göra detta när som helst innan du lagrar det, så klart, så det behöver inte hanteras av databasen.

Du kan hämta UUID så här:

SELECT HEX(UUID) FROM sometable;

Bara ifall någon stöter på den här tråden och är osäker på hur det fungerar.

Och kom ihåg:Om du väljer en rad med UUID, använd UNHEX() på villkoret :

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

eller bokstavlig notation (som nämnts av Alexis Wilke):

SELECT * FROM sometable WHERE UUID = 0x3f06af63a93c11e4979700505690773f;

Och INTE HEX() i kolumnen:

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

Den sista lösningen, medan den fungerar, kräver att MySQL HEX es alla UUID innan det kan avgöra vilka rader som matchar. Det är väldigt ineffektivt.

Edit:Om du använder MySQL 8 bör du ta en titt på UUID-funktionerna som nämns i SlyDaves svar. Det här svaret är fortfarande korrekt, men det optimerar inte UUID-indexen, vilket kan göras inbyggt med dessa funktioner. Om du använder

  1. Java-fil ladda upp till MySQL

  2. Uppdaterar post UTAN att uppdatera tidsstämpel

  3. Hur ORD() fungerar i MariaDB

  4. hur kan jag skapa ett taggningssystem med php och mysql?