Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да генерирам UUIDv4 в MySQL?

Прекарах доста време в търсене на решение и измислих следната функция на mysql, която генерира произволен UUID (т.е. UUIDv4), използвайки стандартни MySQL функции. Отговарям на собствения си въпрос, за да го споделя с надеждата, че ще бъде от полза.

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

Забележка:Използваното генериране на псевдослучайни числа (RAND на MySQL ) не е криптографски защитен и по този начин има известно отклонение, което може да увеличи риска от сблъсък.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Промяна на десетичния разделител в MySQL

  2. Python SQL – Как да използвате SQLite, MySQL и PostgreSQL бази данни с Python

  3. Деактивирайте ONLY_FULL_GROUP_BY

  4. Преместване на възел в дървото на вложените набори

  5. JSON_KEYS() – Връща ключовете от JSON обект в MySQL