MySQL:有没有将UUID转换为整数的简便方法?

3

我需要将数据从系统A传输到系统B。系统A将用户ID存储为UUID,而系统B将其存储为整数。

我正在使用MySQL select语句从系统A检索和保存数据,然后将其转移至系统B。是否有一种简单的方法在MySQL select语句中将UUID转换为整数?


可能是重复的问题 https://dev59.com/cm035IYBdhLWcg3wMNGW - Erik
1
你是在谈论RFC4122中的128位UUID吗?是的:如果你有一个128位整数,你可以把它存储成整数。你也可以使用两个64位整数或四个32位整数。你还可以将它们存储为字符串。 - paddy
是的,这也是我所说的。它代表16个字节或128位。您想将一个128位整数压缩成32位整数吗? - paddy
@paddy,抱歉我真的不太理解这个。系统B具有int(10)unsigned,我不想更改它。这不是4个字节吗?因此,挑战在于将来自系统A的UUID转换适应于系统B。 - user1448031
所以,是的,你说的没错。但我不确定该如何做到这一点。 - user1448031
显示剩余2条评论
1个回答

4

正如在评论中所讨论的那样,你不能简单地将UUID转换为整数并期望它是唯一的。UUID是128位,而 INT(10) 只有32位。这意味着你必须忽略96位,这相当于非常大数量的潜在冲突(每个唯一的32位值约有78个千亿个不同的UUID)。

但不是所有的都失去了希望,因为在32位内可以表示多达约40亿个用户,这可能已经足够了。你需要做的就是将现有的UUID映射到一个整数上,这其实非常直观。

为此,您可以创建一个翻译表,该表存储UUID(作为主键)和唯一整数(可能是自增字段)。您可以使用此表从系统A映射到系统B(反之亦然)。您可以将此表放入两个数据库中的任何一个中,也可以将其保持分离。个人而言,我会将其放入系统B中,因为那里的userId整数值实际上是有意义的。


谢谢您的回复。是的,您的解决方案似乎很好用。我不能把翻译表放在B系统中。我可以在A系统中创建一个翻译表,那应该也能正常工作。我想知道是否可能在A系统中使用子查询来进行映射(而不是创建新表)。我想不出如何做到这一点。有什么想法吗? - user1448031
为什么不在系统A的用户表中添加一个额外的字段呢?比如system_b_user_id,当然要对其进行UNIQUE约束。 - paddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接