sql >> Database teknologi >  >> RDS >> Mysql

Indsættelse og valg af UUID'er som binære(16)

Altså som svar på kommentarer. Den korrekte måde at gemme en 36-char UUID som binær(16) er at udføre indsættelsen på en måde som:

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

UNHEX fordi et UUID allerede er en hexed værdi. Vi trimmer (REPLACE ) bindestregerne i sætningen for at bringe længden ned til 32 tegn (vores 16 bytes repræsenteret som HEX ). Du kan naturligvis gøre dette på et hvilket som helst tidspunkt, før du gemmer det, så det ikke behøver at blive håndteret af databasen.

Du kan hente UUID'et sådan her:

SELECT HEX(UUID) FROM sometable;

Bare hvis nogen støder på denne tråd og er usikker på, hvordan det fungerer.

Og husk:Hvis du vælger en række ved hjælp af UUID, skal du bruge UNHEX() på betingelse :

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

eller bogstavelig notation (som nævnt af Alexis Wilke):

SELECT * FROM sometable WHERE UUID = 0x3f06af63a93c11e4979700505690773f;

Og IKKE HEX() på kolonnen:

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

Den sidste løsning, mens den virker, kræver, at MySQL HEX es alle UUID'er, før den kan bestemme, hvilke rækker der matcher. Det er meget ineffektivt.

Edit:Hvis du bruger MySQL 8, bør du se på UUID-funktionerne som nævnt i SlyDaves svar. Dette svar er stadig korrekt, men det optimerer ikke UUID-indekserne, som kan udføres indbygget ved hjælp af disse funktioner. Hvis du er på

  1. Hvad gør Statement.setFetchSize(nSize)-metoden virkelig i SQL Server JDBC-driveren?

  2. Automatisk stigning i Oracle uden brug af en trigger

  3. Ydeevneværdi af COMB guider

  4. Databaseversionskontrol til MySQL