sql >> データベース >  >> RDS >> Mysql

MySQLでUUIDv4を生成する方法は?

    私は解決策を探すのにかなりの時間を費やし、標準の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 ;
    

    注:使用される疑似乱数生成(MySQLのRAND )暗号的に安全ではないため、衝突のリスクを高める可能性のあるバイアスがあります。



    1. エラーコード1005、SQL状態HY000:テーブルを作成できませんerrno:150

    2. SQLServerテーブルのパーティション分割とパーティションのチュートリアル

    3. MySQL:複合インデックスフルテキスト+ btree?

    4. PostgreSQLでの非同期レプリケーションから同期レプリケーションへの変換