UUIDv7 生成
生成的 UUID 包含一个以 Unix 毫秒表示的 48 位时间戳,接着是版本号“7”(4 位)、用于区分同一毫秒内不同 UUID 的计数器(42 位,其中包含变体字段“2”,2 位),以及一个随机字段(32 位)。
对于任意给定的时间戳(unix_ts_ms),计数器从一个随机值开始,对每个新 UUID 增加 1,直到时间戳发生变化。如果计数器溢出,则将时间戳字段加 1,并将计数器重置为新的随机起始值。
UUID 生成函数保证:在并发运行的线程和查询中,对于相同时间戳的所有函数调用,其计数器字段都是单调递增的。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
| unix_ts_ms |
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
| unix_ts_ms | ver | counter_high_bits |
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
|var| counter_low_bits |
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
| rand_b |
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
Snowflake ID 生成
生成的 Snowflake ID 由当前的 Unix 毫秒级时间戳(41 位加 1 位最高位的 0)组成,其后是机器 ID(10 位)以及计数器(12 位,用于区分同一毫秒内生成的多个 ID)。对于任意给定的时间戳(unix_ts_ms),计数器从 0 开始,对每个新的 Snowflake ID 递增 1,直到时间戳发生变化为止。如果计数器溢出,则将时间戳字段加 1,并将计数器重置为 0。
注意
生成的 Snowflake ID 基于 UNIX 纪元 1970-01-01。尽管目前没有关于 Snowflake ID 纪元选择的标准或建议,但其他系统中的实现可能使用不同的纪元,例如 Twitter/X(2010-11-04)或 Mastodon(2015-01-01)。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
|0| timestamp |
├─┼ ┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
| | machine_id | machine_seq_num |
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
generateUUIDv4
生成第 4 版 UUID。
语法
参数
expr — 任意表达式,在查询中多次调用该函数时用于绕过公共子表达式消除机制。该表达式的值不会影响返回的 UUID。可选。
返回值
UUIDv4 类型的值。
示例
首先,创建一个包含 UUID 类型列的表,然后向该表中插入生成的 UUIDv4 值。
CREATE TABLE tab (uuid UUID) ENGINE = Memory;
INSERT INTO tab SELECT generateUUIDv4();
SELECT * FROM tab;
结果:
┌─────────────────────────────────uuid─┐
│ f4bf890f-f9dc-4332-ad5c-0c18e73f28e9 │
└──────────────────────────────────────┘
每行生成多个 UUID 的示例
SELECT generateUUIDv4(1), generateUUIDv4(2);
┌─generateUUIDv4(1)────────────────────┬─generateUUIDv4(2)────────────────────┐
│ 2d49dc6e-ddce-4cd0-afb8-790956df54c1 │ 8abf8c13-7dea-4fdf-af3e-0e18767770e6 │
└──────────────────────────────────────┴──────────────────────────────────────┘
generateUUIDv7
生成 版本 7 的 UUID。
有关 UUID 结构、计数器管理和并发保证的详细信息,请参阅“UUIDv7 generation”一节。
注意
截至 2024 年 4 月,版本 7 UUID 仍处于草案阶段,其布局在未来可能会发生变化。
语法
参数
expr — 任意表达式,在查询中多次调用该函数时,用于绕过公共子表达式消除。该表达式的值不会影响返回的 UUID。可选。
返回值
UUIDv7 类型的值。
示例
首先,创建一个包含 UUID 类型列的表,然后向该表插入一个生成的 UUIDv7。
CREATE TABLE tab (uuid UUID) ENGINE = Memory;
INSERT INTO tab SELECT generateUUIDv7();
SELECT * FROM tab;
结果:
┌─────────────────────────────────uuid─┐
│ 018f05af-f4a8-778f-beee-1bedbc95c93b │
└──────────────────────────────────────┘
每行生成多个 UUID 的示例
SELECT generateUUIDv7(1), generateUUIDv7(2);
┌─generateUUIDv7(1)────────────────────┬─generateUUIDv7(2)────────────────────┐
│ 018f05c9-4ab8-7b86-b64e-c9f03fbd45d1 │ 018f05c9-4ab8-7b86-b64e-c9f12efb7e16 │
└──────────────────────────────────────┴──────────────────────────────────────┘
dateTimeToUUIDv7
将给定时间的 DateTime 值转换为对应的 UUIDv7。
有关 UUID 结构、计数器管理以及并发保证的详细信息,请参阅 "UUIDv7 generation" 一节。
注意
截至 2024 年 4 月,版本 7 的 UUID 仍处于草案状态,其结构布局在未来可能会发生变化。
语法
参数
返回值
类型为 UUIDv7 的值。
示例
SELECT dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai'));
结果:
┌─dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai'))─┐
│ 018f05af-f4a8-778f-beee-1bedbc95c93b │
└─────────────────────────────────────────────────────────────────────────┘
同一时间戳对应多个 UUID 的示例
SELECT dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56'));
SELECT dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56'));
结果
┌─dateTimeToUUIDv7(t⋯08-15 18:57:56'))─┐
1. │ 017b4b2d-7720-76ed-ae44-bbcc23a8c550 │
└──────────────────────────────────────┘
┌─dateTimeToUUIDv7(t⋯08-15 18:57:56'))─┐
1. │ 017b4b2d-7720-76ed-ae44-bbcf71ed0fd3 │
└──────────────────────────────────────┘
该函数确保对同一时间戳进行多次调用时,生成的 UUID 唯一且单调递增。
empty
检查输入的 UUID 是否为空。
语法
如果 UUID 的各位全部为 0(零 UUID),则被视为空。
该函数同样适用于 Array 和 String。
参数
返回值
- 对空 UUID 返回
1,对非空 UUID 返回 0。参见 UInt8。
示例
要生成 UUID 值,ClickHouse 提供了 generateUUIDv4 函数。
查询:
SELECT empty(generateUUIDv4());
结果:
┌─empty(generateUUIDv4())─┐
│ 0 │
└─────────────────────────┘
notEmpty
检查输入的 UUID 是否非空。
语法
如果一个 UUID 的所有位都是零(零 UUID),则认为该 UUID 为空。
该函数同样适用于 Array 和 String 类型。
参数
返回值
- 对于非空 UUID 返回
1,对于空 UUID 返回 0。参见 UInt8。
示例
要生成 UUID 值,ClickHouse 提供了 generateUUIDv4 函数。
查询:
SELECT notEmpty(generateUUIDv4());
结果:
┌─notEmpty(generateUUIDv4())─┐
│ 1 │
└────────────────────────────┘
toUUID
将 String 类型的值转换为 UUID。
返回值
UUID 类型的值。
使用示例
SELECT toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0') AS uuid
结果:
┌─────────────────────────────────uuid─┐
│ 61f0c404-5cb3-11e7-907b-a6006ad3dba0 │
└──────────────────────────────────────┘
toUUIDOrDefault
参数
string — 长度为 36 个字符的 String 或 FixedString(36)。String。
default — 当第一个参数无法转换为 UUID 类型时用作默认值的 UUID。UUID。
返回值
UUID
toUUIDOrDefault(string, default)
返回值
UUID 类型的值。
使用示例
第一个示例在第一个参数可被转换时,返回将其转换为 UUID 类型的结果:
SELECT toUUIDOrDefault('61f0c404-5cb3-11e7-907b-a6006ad3dba0', cast('59f0c404-5cb3-11e7-907b-a6006ad3dba0' AS UUID));
结果:
┌─toUUIDOrDefault('61f0c404-5cb3-11e7-907b-a6006ad3dba0', CAST('59f0c404-5cb3-11e7-907b-a6006ad3dba0', 'UUID'))─┐
│ 61f0c404-5cb3-11e7-907b-a6006ad3dba0 │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
第二个示例会返回第二个参数(提供的默认 UUID),因为第一个参数无法转换为 UUID 类型:
SELECT toUUIDOrDefault('-----61f0c404-5cb3-11e7-907b-a6006ad3dba0', cast('59f0c404-5cb3-11e7-907b-a6006ad3dba0' AS UUID));
结果:
┌─toUUIDOrDefault('-----61f0c404-5cb3-11e7-907b-a6006ad3dba0', CAST('59f0c404-5cb3-11e7-907b-a6006ad3dba0', 'UUID'))─┐
│ 59f0c404-5cb3-11e7-907b-a6006ad3dba0 │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
toUUIDOrNull
接受一个 String 类型的参数,并尝试将其解析为 UUID。若解析失败,则返回 NULL。
返回值
Nullable(UUID) 类型的值。
使用示例
SELECT toUUIDOrNull('61f0c404-5cb3-11e7-907b-a6006ad3dba0T') AS uuid
结果:
┌─uuid─┐
│ ᴺᵁᴸᴸ │
└──────┘
toUUIDOrZero
它接受一个 String 类型的参数,并尝试将其解析为 UUID。如果解析失败,则返回全为 0 的 UUID。
返回值
UUID 类型的值。
使用示例
SELECT toUUIDOrZero('61f0c404-5cb3-11e7-907b-a6006ad3dba0T') AS uuid
结果:
┌─────────────────────────────────uuid─┐
│ 00000000-0000-0000-0000-000000000000 │
└──────────────────────────────────────┘
UUIDStringToNum
接受一个包含 36 个字符、格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 的 string,并返回其二进制表示形式的 FixedString(16)。其格式可通过可选参数 variant 指定(默认使用 Big-endian)。
语法
UUIDStringToNum(string[, variant = 1])
参数
返回值
FixedString(16)
使用示例
SELECT
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
UUIDStringToNum(uuid) AS bytes
结果:
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
SELECT
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
UUIDStringToNum(uuid, 2) AS bytes
结果:
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ @</a;]~!p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
UUIDNumToString
接受一个包含 UUID 二进制表示的 binary 值,其格式可以通过 variant(默认为 Big-endian)进行可选指定,并返回一个文本格式的、长度为 36 个字符的字符串。
语法
UUIDNumToString(binary[, variant = 1])
参数
返回值
字符串。
使用示例
SELECT
'a/<@];!~p{jTj={)' AS bytes,
UUIDNumToString(toFixedString(bytes, 16)) AS uuid
结果:
┌─bytes────────────┬─uuid─────────────────────────────────┐
│ a/<@];!~p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
└──────────────────┴──────────────────────────────────────┘
SELECT
'@</a;]~!p{jTj={)' AS bytes,
UUIDNumToString(toFixedString(bytes, 16), 2) AS uuid
结果:
┌─bytes────────────┬─uuid─────────────────────────────────┐
│ @</a;]~!p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
└──────────────────┴──────────────────────────────────────┘
UUIDToNum
接受一个 UUID,并返回其作为 FixedString(16) 的二进制表示形式,其字节序格式可通过可选参数 variant 指定(默认为 Big-endian)。此函数用于替代将 UUIDStringToNum(toString(uuid)) 这两个函数组合调用的用法,因此在从 UUID 中提取字节时,无需先将 UUID 转换为字符串作为中间步骤。
语法
UUIDToNum(uuid[, variant = 1])
参数
uuid — UUID。
variant — 一个整数,用于表示 RFC4122 中指定的变体。1 = Big-endian(默认),2 = Microsoft。
返回值
UUID 的二进制形式。
使用示例
SELECT
toUUID('612f3c40-5d3b-217e-707b-6a546a3d7b29') AS uuid,
UUIDToNum(uuid) AS bytes
结果:
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
SELECT
toUUID('612f3c40-5d3b-217e-707b-6a546a3d7b29') AS uuid,
UUIDToNum(uuid, 2) AS bytes
结果:
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ @</a;]~!p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
UUIDv7ToDateTime
返回第 7 版 UUID 的时间戳部分。
语法
UUIDv7ToDateTime(uuid[, timezone])
参数
返回值
- 精确到毫秒的时间戳。如果 UUID 不是有效的版本 7 UUID,则返回 1970-01-01 00:00:00.000。DateTime64(3)。
使用示例
SELECT UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'))
结果:
┌─UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'))─┐
│ 2024-04-22 15:30:29.048 │
└──────────────────────────────────────────────────────────────────┘
SELECT UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'), 'America/New_York')
结果:
┌─UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'), 'America/New_York')─┐
│ 2024-04-22 08:30:29.048 │
└──────────────────────────────────────────────────────────────────────────────────────┘
serverUUID
返回在首次启动 ClickHouse 服务器时生成的随机 UUID。该 UUID 存储在 ClickHouse 服务器目录中的 uuid 文件中(例如 /var/lib/clickhouse/),并在服务器重启期间保持不变。
语法
返回值
generateSnowflakeID
生成 Snowflake ID。
该函数保证在并发运行的线程和查询中,对该函数的所有调用,其时间戳中的计数字段都单调递增。
实现细节参见“Snowflake ID generation”一节。
语法
generateSnowflakeID([expr, [machine_id]])
参数
expr — 任意表达式,在查询中多次调用该函数时,用于绕过公共子表达式消除。该表达式的值不会影响返回的 Snowflake ID。可选。
machine_id — 机器 ID,将使用其最低的 10 位。Int64。可选。
返回值
类型为 UInt64 的值。
示例
首先,创建一个包含 UInt64 类型列的表,然后向该表插入生成的 Snowflake ID。
CREATE TABLE tab (id UInt64) ENGINE = Memory;
INSERT INTO tab SELECT generateSnowflakeID();
SELECT * FROM tab;
结果:
┌──────────────────id─┐
│ 7199081390080409600 │
└─────────────────────┘
在每行生成多个 Snowflake ID 的示例
SELECT generateSnowflakeID(1), generateSnowflakeID(2);
┌─generateSnowflakeID(1)─┬─generateSnowflakeID(2)─┐
│ 7199081609652224000 │ 7199081609652224001 │
└────────────────────────┴────────────────────────┘
带有表达式和机器 ID 的示例
SELECT generateSnowflakeID('expr', 1);
┌─generateSnowflakeID('expr', 1)─┐
│ 7201148511606784002 │
└────────────────────────────────┘
snowflakeToDateTime
提取 Snowflake ID 中的时间戳部分,并以 DateTime 格式返回。
语法
snowflakeToDateTime(value[, time_zone])
参数
value — Snowflake ID。Int64。
time_zone — 时区。函数会根据该时区解析 time_string。可选。String。
返回值
示例
查询:
SELECT snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC');
结果:
┌─snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC')─┐
│ 2021-08-15 10:57:56 │
└──────────────────────────────────────────────────────────────────┘
snowflakeToDateTime64
从 Snowflake ID 中提取时间戳部分,并以 DateTime64 格式返回。
语法
snowflakeToDateTime64(value[, time_zone])
参数
返回值
示例
查询:
SELECT snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC');
结果:
┌─snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC')─┐
│ 2021-08-15 10:58:19.841 │
└────────────────────────────────────────────────────────────────────┘
dateTimeToSnowflake
将 DateTime 值转换为给定时间点上的第一个 Snowflake ID。
语法
dateTimeToSnowflake(value)
参数
返回值
- 将输入值转换为 Int64 数据类型,即该时间点对应的第一个 Snowflake ID。
示例
查询:
WITH toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS dt SELECT dateTimeToSnowflake(dt);
结果:
┌─dateTimeToSnowflake(dt)─┐
│ 1426860702823350272 │
└─────────────────────────┘
dateTime64ToSnowflake
将 DateTime64 转换为对应时间点的第一个 Snowflake ID。
语法
dateTime64ToSnowflake(value)
参数
返回值
- 将输入值转换为 Int64 数据类型,表示在该时刻的第一个 Snowflake ID。
示例
查询:
WITH toDateTime64('2021-08-15 18:57:56.492', 3, 'Asia/Shanghai') AS dt64 SELECT dateTime64ToSnowflake(dt64);
结果:
┌─dateTime64ToSnowflake(dt64)─┐
│ 1426860704886947840 │
└─────────────────────────────┘
snowflakeIDToDateTime
将 Snowflake ID 中的时间戳部分作为 DateTime 类型的值返回。
语法
snowflakeIDToDateTime(value[, epoch[, time_zone]])
参数
value — Snowflake ID。UInt64。
epoch - Snowflake ID 的纪元时间,从 1970-01-01 起按毫秒计算。默认值为 0(1970-01-01)。对于 Twitter/X 的纪元时间(2015-01-01),请使用 1288834974657。可选。UInt*。
time_zone — 时区。函数会根据该时区解析 time_string。可选。String。
返回值
示例
查询:
SELECT snowflakeIDToDateTime(7204436857747984384) AS res
结果:
┌─────────────────res─┐
│ 2024-06-06 10:59:58 │
└─────────────────────┘
snowflakeIDToDateTime64
返回 Snowflake ID 的时间戳部分,结果类型为 DateTime64。
语法
snowflakeIDToDateTime64(value[, epoch[, time_zone]])
参数
value — Snowflake ID。UInt64。
epoch — Snowflake ID 的纪元时间,即自 1970-01-01 起的毫秒数。默认值为 0(1970-01-01)。对于 Twitter/X 纪元(2015-01-01),请使用 1288834974657。可选。UInt*。
time_zone — 时区。函数会根据该时区解析 time_string。可选。String。
返回值
示例
查询:
SELECT snowflakeIDToDateTime64(7204436857747984384) AS res
结果:
┌─────────────────res─┐
│ 2024-06-06 10:59:58 │
└─────────────────────┘
dateTimeToSnowflakeID
将 DateTime 值转换为给定时间点对应的第一个 Snowflake ID。
语法
dateTimeToSnowflakeID(value[, epoch])
参数
value — 日期时间值。DateTime。
epoch - Snowflake ID 的纪元时间,自 1970-01-01 起按毫秒计。默认值为 0(1970-01-01)。对于 Twitter/X 的纪元时间(2015-01-01),请提供 1288834974657。可选。UInt*。
返回值
- 将输入值转换为在该时间点的第一个 Snowflake ID,并以 UInt64 表示。
示例
查询:
SELECT toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS dt, dateTimeToSnowflakeID(dt) AS res;
结果:
┌──────────────────dt─┬─────────────────res─┐
│ 2021-08-15 18:57:56 │ 6832626392367104000 │
└─────────────────────┴─────────────────────┘
dateTime64ToSnowflakeID
将 DateTime64 转换为对应时间点上的第一个 Snowflake ID。
语法
dateTime64ToSnowflakeID(value[, epoch])
参数
value — 带时间的日期值。DateTime64。
epoch - Snowflake ID 的纪元时间,自 1970-01-01 起按毫秒计。默认为 0(1970-01-01)。对于 Twitter/X 的纪元时间(2015-01-01),请提供 1288834974657。可选。UInt*。
返回值
- 将输入值转换为 UInt64 类型,表示在该时间点生成的首个 Snowflake ID。
示例
查询:
SELECT toDateTime('2021-08-15 18:57:56.493', 3, 'Asia/Shanghai') AS dt, dateTime64ToSnowflakeID(dt) AS res;
结果:
┌──────────────────────dt─┬─────────────────res─┐
│ 2021-08-15 18:57:56.493 │ 6832626394434895872 │
└─────────────────────────┴─────────────────────┘
另请参阅
UUIDNumToString
引入于:v1.1
接受一个 UUID 的二进制表示形式,其格式可以通过可选参数 variant 指定(默认是 Big-endian),并返回一个长度为 36 的文本格式字符串。
语法
UUIDNumToString(二进制[, 变体])
参数
返回值
返回 UUID 的字符串表示形式。String
示例
使用示例
SELECT
'a/<@];!~p{jTj={)' AS bytes,
UUIDNumToString(toFixedString(bytes, 16)) AS uuid
┌─bytes────────────┬─uuid─────────────────────────────────┐
│ a/<@];!~p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
└──────────────────┴──────────────────────────────────────┘
Microsoft 版本
SELECT
'@</a;]~!p{jTj={)' AS bytes,
UUIDNumToString(toFixedString(bytes, 16), 2) AS uuid
┌─bytes────────────┬─uuid─────────────────────────────────┐
│ @</a;]~!p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
└──────────────────┴──────────────────────────────────────┘
UUIDStringToNum
自 v1.1 起提供
接受一个包含 36 个字符的字符串,格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,并返回其二进制表示形式的 FixedString(16),其格式可以通过 variant 参数可选指定(默认为 Big-endian)。
语法
UUIDStringToNum(string[, variant = 1])
参数
返回值
返回 string 的二进制表示形式。FixedString(16)
示例
用法示例
SELECT
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
UUIDStringToNum(uuid) AS bytes
┌─uuid─────────────────────────────────┬─字节────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
Microsoft 版本
SELECT
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
UUIDStringToNum(uuid, 2) AS bytes
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ @</a;]~!p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
UUIDToNum
自 v24.5 引入
接受一个 UUID,并返回其二进制表示形式,类型为 FixedString(16),其格式可通过可选参数 variant 指定(默认值为 Big-endian)。
此函数替代了调用两个独立函数组合 UUIDStringToNum(toString(uuid)) 的方式,因此在从 UUID 中提取字节时不再需要先将 UUID 中间转换为字符串。
语法
UUIDToNum(uuid[, variant = 1])
参数
返回值
返回 UUID 的二进制形式。FixedString(16)
示例
使用示例
SELECT
toUUID('612f3c40-5d3b-217e-707b-6a546a3d7b29') AS uuid,
UUIDToNum(uuid) AS bytes
┌─uuid─────────────────────────────────┬─字节────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
Microsoft 版本
SELECT
toUUID('612f3c40-5d3b-217e-707b-6a546a3d7b29') AS uuid,
UUIDToNum(uuid, 2) AS bytes
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ @</a;]~!p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
UUIDv7ToDateTime
自 v24.5 引入
返回 UUID 第 7 版中的时间戳部分。
语法
UUIDv7ToDateTime(uuid[, timezone])
参数
返回值
返回一个具有毫秒精度的时间戳。如果 UUID 不是有效的版本 7 UUID,则返回 1970-01-01 00:00:00.000。DateTime64(3)
示例
用法示例
SELECT UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'))
┌─UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'))─┐
│ 2024-04-22 15:30:29.048 │
└──────────────────────────────────────────────────────────────────┘
含时区
SELECT UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'), 'America/New_York')
┌─UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'), 'America/New_York')─┐
│ 2024-04-22 11:30:29.048 │
└─────────────────────────────────────────────────────────────────────────────────────┘
dateTime64ToSnowflake
引入于:v21.10
将 DateTime64 转换为给定时间点的第一个 Snowflake ID。
语法
dateTime64ToSnowflake(value)
参数
返回值
返回将输入值转换为该时间点第一个 Snowflake ID 的结果。Int64
示例
用法示例
WITH toDateTime64('2021-08-15 18:57:56.492', 3, 'Asia/Shanghai') AS dt64 SELECT dateTime64ToSnowflake(dt64);
┌─dateTime64ToSnowflake(dt64)─┐
│ 1426860704886947840 │
└─────────────────────────────┘
dateTime64ToSnowflakeID
引入于:v24.6
将 DateTime64 转换为给定时间点上的第一个 Snowflake ID。
实现细节请参见“Snowflake ID generation”一节。
语法
dateTime64ToSnowflakeID(value[, epoch])
参数
value — 包含时间的日期值。DateTime 或 DateTime64
epoch — Snowflake ID 的纪元时间(自 1970-01-01 起的毫秒数)。默认为 0(1970-01-01)。对于 Twitter/X 的纪元(2015-01-01),请使用 1288834974657。UInt*
返回值
返回输入值在该时间点对应的第一个 Snowflake ID。UInt64
示例
使用示例
SELECT toDateTime64('2025-08-15 18:57:56.493', 3, 'Asia/Shanghai') AS dt, dateTime64ToSnowflakeID(dt) AS res;
┌──────────────────────dt─┬─────────────────res─┐
│ 2025-08-15 18:57:56.493 │ 7362075066076495872 │
└─────────────────────────┴─────────────────────┘
dateTimeToSnowflake
引入版本:v21.10
将一个 DateTime 值转换为给定时间点对应的第一个 Snowflake ID。
语法
dateTimeToSnowflake(value)
参数
返回值
返回对应时间点的第一个 Snowflake ID。Int64
示例
使用示例
WITH toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS dt SELECT dateTimeToSnowflake(dt);
┌─dateTimeToSnowflake(dt)─┐
│ 1426860702823350272 │
└─────────────────────────┘
dateTimeToSnowflakeID
引入版本:v24.6
将一个 DateTime 值转换为给定时间对应的第一个 Snowflake ID。
语法
dateTimeToSnowflakeID(value[, epoch])
参数
value — 包含时间的日期值。DateTime 或 DateTime64
epoch — 可选。Snowflake ID 的纪元起点,以自 1970-01-01 起的毫秒数表示。默认值为 0(1970-01-01)。对于 Twitter/X 的纪元(2015-01-01),请使用 1288834974657。UInt*
返回值
返回在该时间点对应的第一个 Snowflake ID(由输入值计算)。UInt64
示例
使用示例
SELECT toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS dt, dateTimeToSnowflakeID(dt) AS res;
┌──────────────────dt─┬─────────────────res─┐
│ 2021-08-15 18:57:56 │ 6832626392367104000 │
└─────────────────────┴─────────────────────┘
dateTimeToUUIDv7
引入版本:v25.9
将给定时间点的 DateTime 值转换为 UUIDv7。
有关 UUID 结构、计数器管理和并发保证的详细信息,请参阅 “UUIDv7 generation” 一节。
注意
截至 2025 年 9 月,版本 7 的 UUID 仍处于草案状态,其布局在未来可能会发生变化。
语法
参数
返回值
返回 UUIDv7。UUID
示例
用法示例
SELECT dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai'));
┌─dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai'))─┐
│ 018f05af-f4a8-778f-beee-1bedbc95c93b │
└─────────────────────────────────────────────────────────────────────────┘
同一时间戳存在多个 UUID
SELECT dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56'));
SELECT dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56'));
┌─dateTimeToUUIDv7(t⋯08-15 18:57:56'))─┐
│ 017b4b2d-7720-76ed-ae44-bbcc23a8c550 │
└──────────────────────────────────────┘
┌─dateTimeToUUIDv7(t⋯08-15 18:57:56'))─┐
│ 017b4b2d-7720-76ed-ae44-bbcf71ed0fd3 │
└──────────────────────────────────────┘
generateSnowflakeID
自 v24.6 起提供
生成一个 Snowflake ID。
函数 generateSnowflakeID 保证在并发运行的线程和查询中,对于给定时间戳,其计数器字段在所有函数调用中都会单调递增。
有关实现细节,请参阅“Snowflake ID 生成”一节。
语法
generateSnowflakeID([expr, [machine_id]])
参数
expr — 任意表达式,在查询中多次调用该函数时,用于绕过公共子表达式消除机制。表达式的值不会影响返回的 Snowflake ID。可选。
machine_id — 机器 ID,将使用其最低的 10 位。Int64。可选。
返回值
返回 Snowflake ID。UInt64
示例
用法示例
CREATE TABLE tab (id UInt64)
ENGINE = MergeTree()
ORDER BY tuple();
INSERT INTO tab SELECT generateSnowflakeID();
SELECT * FROM tab;
┌──────────────────id─┐
│ 7199081390080409600 │
└─────────────────────┘
每行生成多个 Snowflake ID
SELECT generateSnowflakeID(1), generateSnowflakeID(2);
┌─generateSnowflakeID(1)─┬─generateSnowflakeID(2)─┐
│ 7199081609652224000 │ 7199081609652224001 │
└────────────────────────┴────────────────────────┘
结合表达式和机器 ID
SELECT generateSnowflakeID('expr', 1);
┌─generateSnowflakeID('expr', 1)─┐
│ 7201148511606784002 │
└────────────────────────────────┘
generateUUIDv4
自 v1.1 版本引入。
生成一个第 4 版的 UUID。
语法
参数
expr — 可选。任意表达式,用于在查询中多次调用该函数时绕过公共子表达式消除。该表达式的值不会影响返回的 UUID。
返回值
返回一个 UUIDv4。UUID
示例
用法示例
SELECT generateUUIDv4(number) FROM numbers(3);
┌─generateUUIDv4(number)───────────────┐
│ fcf19b77-a610-42c5-b3f5-a13c122f65b6 │
│ 07700d36-cb6b-4189-af1d-0972f23dc3bc │
│ 68838947-1583-48b0-b9b7-cf8268dd343d │
└──────────────────────────────────────┘
公共子表达式消除
SELECT generateUUIDv4(1), generateUUIDv4(1);
┌─generateUUIDv4(1)────────────────────┬─generateUUIDv4(2)────────────────────┐
│ 2d49dc6e-ddce-4cd0-afb8-790956df54c1 │ 2d49dc6e-ddce-4cd0-afb8-790956df54c1 │
└──────────────────────────────────────┴──────────────────────────────────────┘
generateUUIDv7
引入于:v24.5
生成一个第 7 版 UUID。
有关 UUID 结构、计数器管理和并发保证的详细信息,请参阅“UUIDv7 生成”一节(#uuidv7-generation)。
注意
截至 2025 年 9 月,第 7 版 UUID 仍处于草案状态,其布局在未来可能会发生变化。
语法
参数
expr — 可选。任意表达式,当在查询中多次调用该函数时,用于绕过公共子表达式消除。该表达式的取值不会影响返回的 UUID。Any
返回值
返回一个 UUIDv7。UUID
示例
用法示例
SELECT generateUUIDv7(number) FROM numbers(3);
┌─generateUUIDv7(number)───────────────┐
│ 019947fb-5766-7ed0-b021-d906f8f7cebb │
│ 019947fb-5766-7ed0-b021-d9072d0d1e07 │
│ 019947fb-5766-7ed0-b021-d908dca2cf63 │
└──────────────────────────────────────┘
公共子表达式消除
SELECT generateUUIDv7(1), generateUUIDv7(1);
┌─generateUUIDv7(1)────────────────────┬─generateUUIDv7(1)────────────────────┐
│ 019947ff-0f87-7d88-ace0-8b5b3a66e0c1 │ 019947ff-0f87-7d88-ace0-8b5b3a66e0c1 │
└──────────────────────────────────────┴──────────────────────────────────────┘
readWKTLineString
自版本 v 起引入。
解析 LineString 几何对象的 Well-Known Text (WKT) 表示形式,并以 ClickHouse 的内部格式返回。
语法
readWKTLineString(wkt_string)
参数
wkt_string — 表示 LineString 几何对象的输入 WKT 字符串。String
返回值
该函数返回 ClickHouse 中 LineString 几何对象的内部表示形式。
示例
首次调用
SELECT readWKTLineString('LINESTRING (1 1, 2 2, 3 3, 1 1)');
┌─readWKTLineString('LINESTRING (1 1, 2 2, 3 3, 1 1)')─┐
│ [(1,1),(2,2),(3,3),(1,1)] │
└──────────────────────────────────────────────────────┘
第二次调用
SELECT toTypeName(readWKTLineString('LINESTRING (1 1, 2 2, 3 3, 1 1)'));
┌─toTypeName(readWKTLineString('LINESTRING (1 1, 2 2, 3 3, 1 1)'))─┐
│ LineString │
└──────────────────────────────────────────────────────────────────┘
snowflakeIDToDateTime
引入版本:v24.6
返回 Snowflake ID 中的时间戳部分,类型为 DateTime。
语法
snowflakeIDToDateTime(value[, epoch[, time_zone]])
参数
value — Snowflake ID。UInt64
epoch — 可选。以毫秒为单位、自 1970-01-01 起算的 Snowflake ID 纪元起点。默认值为 0(1970-01-01)。对于 Twitter/X 的纪元(2015-01-01),请使用 1288834974657。UInt*
time_zone — 可选。时区。函数会根据该时区解析 time_string。String
返回值
返回 value 的时间戳部分。DateTime
示例
使用示例
SELECT snowflakeIDToDateTime(7204436857747984384) AS res
┌─────────────────res─┐
│ 2024-06-06 10:59:58 │
└─────────────────────┘
snowflakeIDToDateTime64
引入于:v24.6
将 Snowflake ID 的时间戳部分返回为 DateTime64 类型的值。
语法
snowflakeIDToDateTime64(value[, epoch[, time_zone]])
参数
value — Snowflake ID。UInt64
epoch — 可选。Snowflake ID 的纪元时间,单位为自 1970-01-01 起的毫秒。默认为 0(1970-01-01)。对于 Twitter/X 的纪元(2015-01-01),请使用 1288834974657。UInt*
time_zone — 可选。时区。函数将根据该时区解析 time_string。String
返回值
返回 value 的时间戳部分,类型为 DateTime64,scale = 3,即毫秒精度。DateTime64
示例
用法示例
SELECT snowflakeIDToDateTime64(7204436857747984384) AS res
┌─────────────────res─┐
│ 2024-06-06 10:59:58 │
└─────────────────────┘
snowflakeToDateTime
引入版本:v21.10
从 Snowflake ID 中提取时间戳部分,并以 DateTime 格式返回。
语法
snowflakeToDateTime(value[, time_zone])
参数
返回值
返回 value 的时间戳部分。DateTime
示例
使用示例
SELECT snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC');
┌─snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC')─┐
│ 2021-08-15 10:57:56 │
└──────────────────────────────────────────────────────────────────┘
snowflakeToDateTime64
自 v21.10 引入
提取 Snowflake ID 的时间戳部分,并以 DateTime64 格式返回。
语法
snowflakeToDateTime64(value[, time_zone])
参数
返回值
返回 value 的时间戳部分。DateTime64(3)
示例
使用示例
SELECT snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC');
┌─snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC')─┐
│ 2021-08-15 10:58:19.841 │
└────────────────────────────────────────────────────────────────────┘
toUUIDOrDefault
自 v21.1 起引入
将 String 值转换为 UUID 类型。如果转换失败,则返回一个默认的 UUID 值,而不是抛出错误。
该函数尝试解析长度为 36 个字符、采用标准 UUID 格式(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)的字符串。
如果字符串无法转换为有效的 UUID,函数会返回提供的默认 UUID 值。
语法
toUUIDOrDefault(字符串, 默认值)
参数
string — 长度为 36 的字符串或 FixedString(36),将被转换为 UUID。- default — 当第一个参数无法转换为 UUID 类型时返回的 UUID 值。
返回值
如果转换成功,则返回转换后的 UUID;如果转换失败,则返回默认的 UUID。UUID
示例
转换成功时返回解析后的 UUID
SELECT toUUIDOrDefault('61f0c404-5cb3-11e7-907b-a6006ad3dba0', toUUID('59f0c404-5cb3-11e7-907b-a6006ad3dba0'));
┌─toUUIDOrDefault('61f0c404-5cb3-11e7-907b-a6006ad3dba0', toUUID('59f0c404-5cb3-11e7-907b-a6006ad3dba0'))─┐
│ 61f0c404-5cb3-11e7-907b-a6006ad3dba0 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘
转换失败时返回默认的 UUID
SELECT toUUIDOrDefault('-----61f0c404-5cb3-11e7-907b-a6006ad3dba0', toUUID('59f0c404-5cb3-11e7-907b-a6006ad3dba0'));
┌─toUUIDOrDefault('-----61f0c404-5cb3-11e7-907b-a6006ad3dba0', toUUID('59f0c404-5cb3-11e7-907b-a6006ad3dba0'))─┐
│ 59f0c404-5cb3-11e7-907b-a6006ad3dba0 │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
toUUIDOrNull
引入版本:v20.12
将输入值转换为 UUID 类型的值,但在发生错误时返回 NULL。
类似于 toUUID,但在转换出错时返回 NULL 而不是抛出异常。
支持的参数:
- 标准格式的 UUID 字符串表示(8-4-4-4-12 个十六进制数字)。
- 不带连字符的 UUID 字符串表示(32 个十六进制数字)。
不支持的参数(返回 NULL):
- 无效的字符串格式。
- 非字符串类型。
- 非法的 UUID。
语法
参数
返回值
如果成功,返回 UUID 值,否则返回 NULL。UUID 或 NULL
示例
使用示例
SELECT
toUUIDOrNull('550e8400-e29b-41d4-a716-446655440000') AS valid_uuid,
toUUIDOrNull('invalid-uuid') AS invalid_uuid
┌─valid_uuid───────────────────────────┬─invalid_uuid─┐
│ 550e8400-e29b-41d4-a716-446655440000 │ ᴺᵁᴸᴸ │
└──────────────────────────────────────┴──────────────┘