UUID()¶
UUID() 返回根据 RFC 4122 生成国际通用唯一标识符 UUID(Universally Unique IDentifier)。
函数说明¶
UUID() 返回根据 RFC 4122 生成国际通用唯一标识符 UUID(Universally Unique IDentifier)。
UUID 在空间和时间上是全球唯一的数字。即使是在两个未连接的独立运行的设备上执行 UUID 调用,预计会生成两个不同的值。
备注
尽管 UUID() 值唯一,但它们并非是不可猜测或不可预测的。如果需要不可预测性,则应以其他方式生成 UUID 值。
UUID() 返回一个符合 RFC 4122 标准的版本 1 UUID 的值,为 128 位数字,它表示是一个 utf8mb3 由五个十六进制数字组成的字符串,即 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee,格式解释如下:
前三个数字是从时间戳的低、中和高部分生成的。高位部分还包括 UUID 版本号。
第四个数字保留时间唯一性,以防时间戳值失去单一性(例如,夏令时)。
第五个数字是空间唯一性的 IEEE 802 节点号。如果后者不可用(例如,因为主机设备没有以太网卡,或者不知道如何在主机操作系统上找到接口的硬件地址),则用随机数代替。在这种情况下,无法保证空间唯一性。然而,第五位数字重合的概率很低。
UUID 既是数据类型,也是函数,如需了解更多 UUID 数据类型,参见 UUID 类型。
函数语法¶
> UUID()
示例¶
drop table if exists t1;
create table t1(a INT, b float);
insert into t1 values(12124, -4213.413), (12124, -42413.409);
mysql> SELECT length(uuid()) FROM t1;
+----------------+
| length(uuid()) |
+----------------+
| 36 |
| 36 |
+----------------+
2 rows in set (0.00 sec)
mysql> SELECT UUID();
+--------------------------------------+
| uuid() |
+--------------------------------------+
| b293b688-70a7-11ed-a25a-5ad2460dea50 |
+--------------------------------------+
1 row in set (0.00 sec)
IS_UUID()¶
函数说明¶
IS_UUID(str) 判断一个字符串是否为有效的 UUID。若字符串为有效 UUID 则返回 1,否则返回 0。若参数为 NULL 则返回 NULL。
以下几种 UUID 格式均可识别:
标准带连字符格式:
6ccd780c-baba-1026-9564-5b8c656024db无连字符格式(32 位十六进制数字):
6ccd780cbaba102695645b8c656024db带花括号格式:
{6ccd780c-baba-1026-9564-5b8c656024db}大写格式:
6CCD780C-BABA-1026-9564-5B8C656024DB
该函数对长度和十六进制字符组成进行校验。含额外空格、无效字符或长度不正确的字符串将返回 0。
函数语法¶
> IS_UUID(str)
参数释义¶
参数 |
说明 |
|---|---|
str |
必要参数。待测字符串。 |
示例¶
DROP DATABASE IF EXISTS uuid_test;
CREATE DATABASE uuid_test;
USE uuid_test;
-- 标准 UUID 格式
SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c656024db');
-- 无连字符格式
SELECT IS_UUID('6ccd780cbaba102695645b8c656024db');
-- 带花括号格式
SELECT IS_UUID('{6ccd780c-baba-1026-9564-5b8c656024db}');
-- 大写变体
SELECT IS_UUID('6CCD780C-BABA-1026-9564-5B8C656024DB');
-- URN 格式(不识别为有效 UUID)
SELECT IS_UUID('urn:uuid:6ccd780c-baba-1026-9564-5b8c656024db');
-- 无效:长度不足
SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c656024d');
-- 无效:含非十六进制字符
SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c656024dz');
-- 无效:字节数错误
SELECT IS_UUID('6ccd780c-baba-1026-95645b8c656024db');
-- 空字符串
SELECT IS_UUID('');
-- 非 UUID 字符串
SELECT IS_UUID('not-a-uuid');
-- NULL 参数
SELECT IS_UUID(NULL);
DROP DATABASE uuid_test;
UUID_TO_BIN()¶
函数说明¶
UUID_TO_BIN(str [, swap_flag]) 将 UUID 字符串转换为 16 字节的二进制表示。可选参数 swap_flag 控制字节序:
swap_flag= 0(默认):保留 UUID 字符串中的原始字节顺序。swap_flag= 1:将 time-high 字段移到 time-mid 和 time-low 之前。对于基于时间的 UUID,把最高有效时间位放在前面可以提升 B-tree 索引局部性。
swap_flag 可以是数值,也可以是可解析为数值的字符串。0 表示不交换;任何非零值(包括小数和负数)都表示执行交换。无法解析为数值的字符串会导致错误。若 str 或 swap_flag 为 NULL,函数返回 NULL。
函数语法¶
> UUID_TO_BIN(str [, swap_flag])
参数释义¶
参数 |
说明 |
|---|---|
str |
必要参数。有效的 UUID 字符串,支持带连字符、无连字符、带花括号或大写格式。 |
swap_flag |
可选参数。0 为保留原始字节顺序(默认);任何非零值都会将 time-high 移到 time-mid 和 time-low 之前以优化索引。 |
示例¶
DROP DATABASE IF EXISTS uuid_test;
CREATE DATABASE uuid_test;
USE uuid_test;
-- 默认字节顺序
SELECT HEX(UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db'));
-- 无连字符 UUID
SELECT HEX(UUID_TO_BIN('6ccd780cbaba102695645b8c656024db'));
-- 带花括号 UUID
SELECT HEX(UUID_TO_BIN('{6ccd780c-baba-1026-9564-5b8c656024db}'));
-- 大写 UUID
SELECT HEX(UUID_TO_BIN('6CCD780C-BABA-1026-9564-5B8C656024DB'));
-- 交换字节顺序(swap_flag = 1)
SELECT HEX(UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db', 1));
-- NULL UUID 字符串
SELECT HEX(UUID_TO_BIN(NULL));
-- NULL swap_flag(返回 NULL)
SELECT HEX(UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db', NULL));
DROP DATABASE uuid_test;
BIN_TO_UUID()¶
函数说明¶
BIN_TO_UUID(bin [, swap_flag]) 将 16 字节的二进制表示还原为带连字符格式(aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee)的 UUID 字符串。可选参数 swap_flag 必须与相应 UUID_TO_BIN() 调用中使用的一致:
swap_flag= 0(默认):假定二进制值按原始字节顺序生成。swap_flag= 1:反转UUID_TO_BIN(..., 1)执行的时间字段重排,恢复原始 UUID 字符串的顺序。
输入 bin 必须为恰好 16 个字节。更短或更长的二进制值会产生错误。若 bin 或 swap_flag 为 NULL,函数返回 NULL。
函数语法¶
> BIN_TO_UUID(bin [, swap_flag])
参数释义¶
参数 |
说明 |
|---|---|
bin |
必要参数。由 |
swap_flag |
可选参数。必须与 |
示例¶
DROP DATABASE IF EXISTS uuid_test;
CREATE DATABASE uuid_test;
USE uuid_test;
-- 默认字节顺序的完整往返
SELECT BIN_TO_UUID(UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db'));
-- swap_flag = 1 的完整往返
SELECT BIN_TO_UUID(UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db', 1), 1);
-- swap_flag 前后不一致(结果不正确)
SELECT BIN_TO_UUID(UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db', 1), 0);
-- NULL 二进制值
SELECT BIN_TO_UUID(NULL);
DROP DATABASE uuid_test;
限制¶
UUID() 暂时不支持可选参数,即暂不支持 UUID([number])。