MySQL UUID
简介:本教程向您介绍MySQL UUID,向您展示如何将其用作表的主键(PK),并讨论将其用作主键的优缺点。
MySQL UUID简介
UUID代表Universally Unique IDentifier。UUID基于RFC 4122 “通用唯一标识符(UUID)URN命名空间”定义。
UUID被设计为在空间和时间上全球唯一的数字。预计两个UUID值是不同的,即使它们是在两个独立的服务器上生成的。
在MySQL中,UUID值是一个128位数字,表示为五个十六进制数字的utf8字符串,格式如下:
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
要生成UUID值,请使用以下UUID()函数:
UUID()
UUID()函数返回符合RFC 4122中描述的UUID版本1的UUID值。
例如,以下语句使用UUID()函数生成UUID值:
mysql> select UUID();
+--------------------------------------+
| UUID() |
+--------------------------------------+
| cc2bccd0-c979-11e9-ba8d-d70282892727 |
+--------------------------------------+
1 row in set (0.00 sec)
MySQL UUID与INT自增作为主键比较
优点
将UUID用作主键具有以下优点:
表,数据库甚至服务器之间的UUID值是唯一的,它们允许您合并来自不同数据库的行或跨服务器分发数据库。
UUID值不会公开有关数据的信息,因此在URL中使用它们更安全。例如,如果ID为10的客户通过http://www.example.com/customers/10/URL 访问其帐户,则很容易猜到有客户11,12等,这可能是攻击的目标。
可以在避免往返数据库服务器的任何地方生成UUID值。它还简化了应用程序中的逻辑。例如,要将数据插入父表和子表,您必须先插入父表,获取生成的ID,然后将数据插入子表。通过使用UUID,您可以预先生成父表的主键值,并在事务中同时将行插入父表和子表。
缺点
除了优点,UUID值也有一些缺点:
存储UUID值(16字节)比整数(4字节)或甚至大整数(8字节)占用更多存储空间。
调试似乎更难,想象一下表达WHERE id = 'df3b7cb7-6a95-11e7-8846-b05adad3f0ae' 而不是WHERE id = 10
使用UUID值可能会导致性能问题,因为它们的大小和没有被排序。
MySQL UUID解决方案
在MySQL中,您可以使用紧凑格式(BINARY)存储UUID值,并使用以下函数以人类可读的格式(VARCHAR) 显示它们:
UUID_TO_BIN
BIN_TO_UUID
IS_UUID
请注意UUID_TO_BIN(),BIN_TO_UUID()和IS_UUID()功能仅在MySQL 8.0或更高版本可用。
UUID_TO_BIN() 函数将UUID从人类可读格式(VARCHAR)转换为紧凑格式(BINARY)格式用于存储,并且BIN_TO_UUID()函数将UUID从紧凑格式(BINARY)转换为人类可读格式(VARCHAR)以进行显示。
IS_UUID()如果参数是有效的字符串格式UUID,则函数返回1。如果参数不是有效的字符串格式UUID,则IS_UUID函数返回0.如果参数为NULL,则 IS_UUID()函数返回NULL。
以下是MySQL中有效的字符串格式UUID:
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
aaaaaaaabbbbccccddddeeeeeeeeeeee
{aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}
MySQL UUID示例
我们来看一个使用UUID作为主键的示例。
以下语句创建一个名为的新表people:
CREATE TABLE people (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255)
);
要插入 UUID值入id列,使用UUID()和UUID_TO_BIN()功能如下:
INSERT INTO people(id, name)
VALUES(UUID_TO_BIN(UUID()),'John Doe'),
(UUID_TO_BIN(UUID()),'Will Smith'),
(UUID_TO_BIN(UUID()),'Mary Jane');
要从UUID列查询数据,可以使用BIN_TO_UUID()函数将二进制格式转换为人类可读的格式:
SELECT
BIN_TO_UUID(id) id,
name
FROM
people;
+--------------------------------------+------------+
| id | name |
+--------------------------------------+------------+
| a5a207e7-c97b-11e9-9ffb-c85b762a1a33 | John Doe |
| a5a247cf-c97b-11e9-9ffb-c85b762a1a33 | Will Smith |
| a5a249d2-c97b-11e9-9ffb-c85b762a1a33 | Mary Jane |
+--------------------------------------+------------+
3 rows in set (0.01 sec)
在本教程中,您已了解MySQL UUID以及如何将其用于主键列。