MySql UUID复制错误

MySql UUID复制错误,mysql,duplicates,uuid,Mysql,Duplicates,Uuid,我在MySql 5.5.19中发现了一个bug 执行时: select uuid(), uuid(); 你得到两个相等的ID 我在这个bug中运行了两个,当我将两个UUID插入我的表时,我总是得到相同的值 还有其他人在这两个错误中运行吗?如何执行需要两个UUID作为密钥的insert命令 编辑: 事实上我弄错了,它们在一个数字上是不同的,所以很难看到 c3db9137-705e-11e1-ae17-1c6f6531b785 c3db913f-705e-11e1-ae17-1c6f6531b78

我在MySql 5.5.19中发现了一个bug

执行时:

select uuid(), uuid();
你得到两个相等的ID

我在这个bug中运行了两个,当我将两个UUID插入我的表时,我总是得到相同的值

还有其他人在这两个错误中运行吗?如何执行需要两个UUID作为密钥的insert命令

编辑

事实上我弄错了,它们在一个数字上是不同的,所以很难看到

c3db9137-705e-11e1-ae17-1c6f6531b785
c3db913f-705e-11e1-ae17-1c6f6531b785


UUID被设计为在空间和时间上全局唯一的数字。由于查询是在执行之前编译的,因此您将在同一时间调用
UUID()
两次。因此,您不能期望它在同一个查询中返回两个唯一的值,因为这两个值将使用相同的时间戳。这听起来像是我想要的行为。

我坚信您不会得到重复的值,而是一些几乎相同的值(可能是一个不同的字符)。由于UUID的第一个块是以毫秒为单位从时间戳生成的,这意味着函数是在同一毫秒内执行的(您是在超级计算机上运行的吗?),老实说,这是极不可能的。
如果您确实得到了重复的数据,那么运行两个单独的SELECT uuid()查询,并在所需的查询中使用返回的值

我遇到了相同的问题,因为mysql正在创建,除了使用不同类型的uuid之外,没有什么可做的。我已经尝试过使用随机数生成uuid。它工作得非常好,在迁移到uuid之后,您也可以切换回uuid_v1,我希望这会有所帮助

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

这不是uuid()函数的错误

意外的结果出现了,因为当您的字符集客户端和字符集结果不是utf8时发生了莫名其妙的转换

1 uuid()输出为utf8,无论您的字符集是什么

2当您的字符集客户端和字符集结果的优先级高于utf8(如utf8mb4)时,则会发生莫名其妙的转换,其他优先级较低的字符集(如latin1)工作正常

3莫名其妙的转换将在sql执行之前将uuid()转换为常量字符串,因此在sql执行完成后,相同的uuid()将返回

通过使用explain extended+your子句,然后使用show warnings,您可以看到所有这些事件

如何解决? 1将莫名其妙的转换转换为显式转换 例如: 设置名称utf8mb4; 替换(使用utf8mb4转换(uuid()),'-','')

设置名称utf8mb4; 替换(uuid(),_utf8'-',_utf8'')

2避免莫名其妙的转换 例如:设置名称utf8


这是MySQL 5.6/5.7中的一个bug(在8.0中更正)。MariaDB没有这个bug。 错误在此处填写:
正如@user1862341所解释的,这是由于无法解释的转换造成的,但这仍然是一个错误

我能做些什么使它在同一时间戳中唯一?它的常见问题是,我没有超级计算机。超级计算机有点言过其实。我有一个很容易复制的例子,MySQL在fixture生成过程中为主键字段生成重复的UUID,并加载到2015型号的笔记本电脑上。顺便说一下,一个提示:每当需要比较这么长的字符串时,最快的方法就是CTRL+C/CTRL+F(查找选项)这个答案似乎与当前的问题更相关,但这是一个很好的答案。这可能不是本文问题的原因,但却是我的问题(使用了更新):谢谢:-)