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

Hvordan genererer man en UUIDv4 i MySQL?

Jeg har brugt en del tid på at lede efter en løsning og fandt på følgende mysql-funktion, der genererer et tilfældigt UUID (dvs. UUIDv4) ved hjælp af standard MySQL-funktioner. Jeg besvarer mit eget spørgsmål for at dele det i håbet om, at det vil være nyttigt.

-- 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 ;

Bemærk:Den brugte pseudo-tilfældige talgenerering (MySQL's RAND ) er ikke-kryptografisk sikker og har derfor en vis bias, som kan øge kollisionsrisikoen.



  1. Tilføjelse af fremmednøgle til en skinnemodel

  2. Hvordan kan jeg dræbe alle sessioner, der forbinder til min oracle-database?

  3. Simple tilfældige prøver fra en SQL-database

  4. Funktionsbaserede indekser i SQL Server