MySQL UUID

17 Mar 2025 | 4 分钟阅读

UUID 是由 RFC 4122 (它是一个全球唯一标识符 URN 命名空间) 指定的全球唯一标识符,是一个 128 位长的值。它的设计方式是,它生成的数字在全球范围内根据空间和时间都是唯一的。如果我们连续调用两个 UUID,我们将获得两个不同的值,即使它们是在两个未连接的独立设备上执行的。

注意:虽然 UUID() 总是生成唯一值,但它们不可猜测或预测。这意味着它总是返回一个随机数。

UUID 的结构

MySQL 中的 UUID 返回一个 128 位长的值。它以人类可读的格式表示为 UTF8 字符串,由以下格式的五个十六进制数字组成

  • 前三个数字作为时间戳格式的一部分生成,例如低、中和高。这里,高部分包含 UUID 版本号。
  • 第四个数字负责在时间戳值失去单调性时保持时间唯一性。
  • 第五个数字表示 IEEE 802 节点号,它表示空间唯一性。如果该字母不可用,它将替换为不保证空间唯一性的随机数。

以下是 MySQL 中 UUID 值的有效字符串格式,它是由 32 位十六进制数字和四个连字符 (-) 组成的排列:

我们可以使用以下函数在 MySQL 中生成 UUID 值

上述函数根据 RFC 4122 中描述的 UUID 版本 1 返回一个 UUID 值。成功执行上述语句后,它将生成 UUID 值,如下所示

MySQL UUID

MySQL UUID 与 AUTO_INCREMENT PRIMARY KEY

MySQL 中的 UUID 是 AUTO_INCREMENT PRIMARY KEY 的一个很好的替代方案。以下是 UUID 相对于 AUTO_INCREMENT PRIMARY KEY 的优点

优点

以下是使用 UUID 作为主键的优点

  • MySQL 中的 UUID 值在表、数据库和服务器之间都是唯一的。它允许我们合并来自分布式/不同数据库的跨服务器行。
  • UUID 值不提供有关我们数据的信息,这意味着它很难猜测。因此,在 URL 中使用它是安全的。
  • UUID 值可以离线生成,这意味着我们可以在任何地方生成它,而无需与数据库服务器交换信息。
  • 它还简化了复制(应用程序中的逻辑)。例如,如果我们要将数据插入到父表和子表中,我们必须首先将数据插入到父表中,获取生成的 id,然后将记录填充到子表中。使用 UUID,我们可以生成父表的主键值,并将行同时插入到两个表中。

缺点

除了优点,以下是使用 UUID 作为主键的缺点

  • 如果我们将 UUID(16 字节)值存储在数据库中,它比整数(4 字节)或大整数(8 字节)占用更多的空间/存储。
  • 这使得调试更加困难。例如,我们可以想象表达式 WHERE id = '185e6dfd-1cc8-11eb-9a2c-107d1a24f935' 而不是 WHERE id = 5。
  • 由于无序的值及其大小,它也可能导致性能问题

MySQL UUID 解决方案

我们可以通过使用下面给出的函数来克服 MySQL 中的这些问题。这些函数允许我们以紧凑格式 (BINARY) 存储 UUID 值,并以人类可读格式 (VARCHAR) 显示它们。这些函数的名称是

  • UUID_TO_BIN
  • BIN_TO_UUID
  • IS_UUID

注意:需要注意的是,这些函数仅在 MySQL 8.0 或更高版本中可用。

UUID_TO_BIN() 函数用于将 UUID 值从人类可读格式转换为紧凑格式,以便将其存储在数据库中。

BIN_TO_UUID() 函数用于将 UUID 从紧凑格式转换为人类可读格式,以便显示。

IS_UUID() 函数用于验证 UUID 的字符串格式。当参数有效时返回 1,当参数无效时返回 0。如果参数为 NULL,则返回 NULL。

MySQL UUID 示例

让我们通过一个示例来了解如何使用 UUID。首先,我们将使用以下语句创建一个名为 employee 的新表

接下来,我们需要将值插入到表中。此外,如果我们要将 UUID 值添加到 emp_id 列中,我们必须使用 UUID() 和 UUID_TO_BIN() 函数,如下所示

现在,执行 SELECT 语句以验证插入的记录。

MySQL UUID

最后,我们将使用 BIN_TO_UUID() 函数从 UUID 列查询数据,该函数将二进制格式转换为人类可读格式。请参阅以下语句

我们将得到如下输出

MySQL UUID

MySQL UUID 与 UUID(short)

UUID() 和 UUID(short) 都是 MySQL 中不同的函数。它们之间的基本区别在下面的比较图中讨论

UUIDUUID(short)
UUID 是由 RFC 4122 指定的全球唯一标识符,是一个 128 位长的值,表示为由五个十六进制数字组成的 UTF8 字符串。此函数生成一个短的全球唯一标识符,它是一个 64 位无符号整数,与 UUID() 函数生成的字符串格式的 128 位标识符不同。
它生成一个符合 16 字节版本 1 UUID 的值。版本 1 UUID 是服务器 ID 的位聚合、当前时间戳、几个字节和实用位。它的返回值包含服务器 ID 的位聚合、一个相当静态的时间分量和一个顺序递增的 24 位整数。
在 UUID 中,服务器 ID 为 6 字节长,这使得空间唯一。在 UUID (short) 中,服务器 ID 只有一字节;这就是它失去空间唯一性的原因。