当前位置: 首页 > 面试题库 >

如何在MySQL中生成UUIDv4?

费辰阳
2023-03-14
问题内容

MySQL的UUID函数返回一个UUIDv1
GUID。我正在寻找一种在SQL中生成随机GUID(即UUIDv4)的简单方法。


问题答案:

我花了很多时间寻找解决方案,并提出了以下mysql函数,该函数使用标准MySQL函数生成一个随机UUID(即UUIDv4)。我正在回答我自己的问题,以期分享它,希望对大家有用。

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

CREATE FUNCTION uuid_v4()
    RETURNS CHAR(36)
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’s RAND)在密码上不是安全的,因此存在一些偏差,可能会增加冲突风险。



 类似资料:
  • 问题内容: 我正在使用PHP和MySQL编写脚本,并且想要获得一个唯一的ID(由字符串组成:大写字母和带数字的小写字母),例如:。我在PHP中发现了许多可以生成此类数字的函数,但我担心如何确保id唯一! 更新 :uuid很长,我的意思是这样的ID:(P5Dc)一个11个字母数字的字符。 问题答案: 一个 编程的方式 可以是: 在字段中添加一个唯一索引 在PHP中生成随机字符串 在PHP中循环(wh

  • 问题内容: 有没有一种方法可以生成可以在JOIN中使用的任意数量的行,类似于Oracle语法: 问题答案: 讨厌这样说,但是这是四大公司中唯一没有此功能的公司。 在: 在(最多行)中: 或使用提示最多 在: 在中,什么都没有。

  • 问题内容: 我正在尝试在MySQL中生成序列表,以便可以从获得唯一ID 。 问题是我需要动态地多个序列。 首先,我创建了一个表: 然后尝试使用http://dev.mysql.com/doc/refman/5.0/en/information- functions.html#function_last-insert- id中的 示例获取编号 一段时间后,我意识到我还需要安全地为新标签生成行。因此,

  • 问题内容: 我已经在MySQL Workbench中使用表,外键等创建了一个EER图,现在我想生成一个“ .sql”脚本来创建该数据库。我怎么做? 问题答案: 尝试:

  • 问题内容: 我想用Java生成一个.torrent文件,但是我不想要一个大的API,它可以执行诸如抓取跟踪器,种子等操作。这仅适用于生成元数据的客户端。存在哪些轻量级解决方案?我只生成一个.zip文件的.torrent。 谢谢! 问题答案: 我整理了这段独立的Java代码,以准备一个带有单个文件的.torrent文件。 通过调用.torrent文件的名称,共享文件的名称和跟踪器URL 来创建.to

  • 问题内容: 我需要使用表/结果集/任何包含整数(包括整数)的联接。是否有一种简单的方法来实现这一目标而不仅仅是构建表? (顺便说一句,这种类型的结构称为“ 元查询 ”吗?) 被限制在合理的范围内(<1000) 问题答案: MySQL中没有序列号生成器(CREATE SEQUENCE )。最近的是,它可以帮助您构造表。