sql >> Database >  >> RDS >> Mysql

Hoe een UUIDv4 genereren in MySQL?

Ik heb geruime tijd gezocht naar een oplossing en kwam met de volgende mysql-functie die een willekeurige UUID (d.w.z. UUIDv4) genereert met behulp van standaard MySQL-functies. Ik beantwoord mijn eigen vraag om die te delen in de hoop dat het nuttig zal zijn.

-- Change delimiter so that the function body doesn't end the function declaration
DELIMITER //

CREATE FUNCTION uuid_v4()
    RETURNS CHAR(36) NO SQL
BEGIN
    -- Generate 8 2-byte strings that we will combine into a UUIDv4
    SET @h1 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h2 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h3 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h6 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h7 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
    SET @h8 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');

    -- 4th section will start with a 4 indicating the version
    SET @h4 = CONCAT('4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'));

    -- 5th section first half-byte can only be 8, 9 A or B
    SET @h5 = CONCAT(HEX(FLOOR(RAND() * 4 + 8)),
                LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'));

    -- Build the complete UUID
    RETURN LOWER(CONCAT(
        @h1, @h2, '-', @h3, '-', @h4, '-', @h5, '-', @h6, @h7, @h8
    ));
END
//
-- Switch back the delimiter
DELIMITER ;

Opmerking:de gebruikte pseudo-willekeurige generatie van getallen (MySQL's RAND ) is niet cryptografisch veilig en heeft dus enige vooringenomenheid die het botsingsrisico kan vergroten.



  1. SQL:zoek naar een string in elke varchar-kolom in een database

  2. Oracle SQL Developer 21.4.2 en SQLcl 21.4.1 zijn nu beschikbaar

  3. Hoe maak je meerdere LEFT JOINs met OR volledig gebruik van een samengestelde index? (deel 2)

  4. PreparedStatement en setTimestamp in oracle jdbc