sql >> Database >  >> RDS >> Mysql

UUID's als binair invoegen en selecteren (16)

Dus als reactie op opmerkingen. De juiste manier om een ​​36-tekens UUID als binair (16) op te slaan, is door het invoegen op een manier als volgt uit te voeren:

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

UNHEX omdat een UUID al een hexed-waarde is. We trimmen (REPLACE ) de streepjes in de instructie om de lengte terug te brengen tot 32 tekens (onze 16 bytes weergegeven als HEX ). U kunt dit natuurlijk op elk moment doen voordat u het opslaat, zodat het niet door de database hoeft te worden afgehandeld.

U kunt de UUID als volgt ophalen:

SELECT HEX(UUID) FROM sometable;

Voor het geval iemand deze thread tegenkomt en niet zeker weet hoe dit werkt.

En onthoud:als je een rij selecteert met de UUID, gebruik dan UNHEX() op voorwaarde :

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

of letterlijke notatie (zoals vermeld door Alexis Wilke):

SELECT * FROM sometable WHERE UUID = 0x3f06af63a93c11e4979700505690773f;

En NIET HEX() op de kolom:

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

De laatste oplossing, hoewel het werkt, vereist dat MySQL HEX es alle UUID's voordat het kan bepalen welke rijen overeenkomen. Het is erg inefficiënt.

Bewerken:als je MySQL 8 gebruikt, moet je eens kijken naar de UUID-functies zoals vermeld in het antwoord van SlyDave. Dit antwoord is nog steeds correct, maar het optimaliseert niet de UUID-indexen die native kunnen worden gedaan met behulp van die functies. Als u zich op

  1. Huidige tijd in UTC gebruiken als standaardwaarde in PostgreSQL

  2. Toegang krijgen tot een RowDataPacket-object

  3. MySQL SELECT LAST_INSERT_ID() voor samengestelde sleutel. Is dit mogelijk?

  4. ORDER BY ENUM veld in MYSQL