Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wygenerować UUIDv4 w MySQL?

Spędziłem sporo czasu szukając rozwiązania i wymyśliłem następującą funkcję mysql, która generuje losowy UUID (tj. UUIDv4) przy użyciu standardowych funkcji MySQL. Odpowiadam na własne pytanie, aby podzielić się tym w nadziei, że będzie to przydatne.

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

Uwaga:użyto generowania liczb pseudolosowych (RAND MySQL'a) ) nie jest kryptograficznie bezpieczny i dlatego ma pewne odchylenie, które może zwiększyć ryzyko kolizji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. niewłaściwe zabijanie mysqld - teraz się nie uruchamia

  2. Jak sprawdzić stan połączenia MySQL w C#

  3. Jak połączyć się z MySQL za pomocą UTF8 w skrypcie perla?

  4. Pobieranie danych z listy rozwijanej wielokrotnego wyboru za pomocą PHP do wstawienia do MySQL

  5. Skopiuj dane do nowej tabeli w MySQL