处理 UUID 的函数
generateUUIDv4
语法
参数
返回值
类型为 UUIDv4 的值。
示例
首先,创建一个 UUID 类型的列的表,然后将生成的 UUIDv4 插入到表中。
结果:
每行生成多个 UUID 的示例
generateUUIDv7
生成的 UUID 包含当前的 Unix 时间戳(以毫秒为单位,48 位),后跟版本“7”(4 位),一个计数器(42 位)用于区分同一毫秒内的 UUID(包括变体字段“2”,2 位),以及一个随机字段(32 位)。 对于任何给定的时间戳(unix_ts_ms),计数器从随机值开始,并为每个新 UUID 递增1,直到时间戳发生变化。 如果计数器溢出,时间戳字段递增1,计数器重置为随机的新起始值。
函数 generateUUIDv7
保证在并发执行的线程和查询中,时间戳内的计数器字段会单调递增。
截至 2024 年 4 月,版本 7 的 UUID 处于草案状态,其布局可能在未来发生变化。
语法
参数
返回值
类型为 UUIDv7 的值。
示例
首先,创建一个 UUID 类型的列的表,然后将生成的 UUIDv7 插入到表中。
结果:
每行生成多个 UUID 的示例
empty
检查输入的 UUID 是否为空。
语法
如果 UUID 全部为零(零 UUID),则认为它是空的。
参数
x
— 一个 UUID。 UUID。
返回值
- 空 UUID 返回
1
,非空 UUID 返回0
。 UInt8。
示例
要生成 UUID 值,ClickHouse 提供了 generateUUIDv4 函数。
查询:
结果:
notEmpty
检查输入的 UUID 是否非空。
语法
如果 UUID 全部为零(零 UUID),则认为它是空的。
参数
x
— 一个 UUID。 UUID。
返回值
- 非空 UUID 返回
1
,空 UUID 返回0
。 UInt8。
示例
要生成 UUID 值,ClickHouse 提供了 generateUUIDv4 函数。
查询:
结果:
toUUID
将字符串类型的值转换为 UUID。
返回值
UUID 类型的值。
使用示例
结果:
toUUIDOrDefault
参数
返回值
UUID
返回值
UUID 类型的值。
使用示例
第一个示例将返回可以转换为 UUID 类型的第一个参数:
结果:
第二个示例返回第二个参数(提供的默认 UUID),因为第一个参数无法转换为 UUID 类型:
结果:
toUUIDOrNull
接受字符串类型的参数,并尝试将其解析为 UUID。如果失败,返回 NULL。
返回值
Nullable(UUID) 类型的值。
使用示例
结果:
toUUIDOrZero
接受字符串类型的参数,并尝试将其解析为 UUID。如果失败,返回零 UUID。
返回值
UUID 类型的值。
使用示例
结果:
UUIDStringToNum
接受一个包含 36 个字符的 string
,格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
,并返回 FixedString(16) 作为其二进制表示,格式可由 variant
(默认值为 Big-endian
)指定。
语法
参数
string
— 36 个字符的 字符串 或 FixedStringvariant
— 整数,表示由 RFC4122 指定的变体。1 =Big-endian
(默认),2 =Microsoft
。
返回值
FixedString(16)
使用示例
结果:
结果:
UUIDNumToString
接受包含 UUID 的二进制表示的 binary
,可选地由 variant
(默认值为 Big-endian
)指定格式,并返回包含 36 个字符的文本格式字符串。
语法
参数
binary
— FixedString(16) 作为 UUID 的二进制表示。variant
— 整数,表示由 RFC4122 指定的变体。1 =Big-endian
(默认),2 =Microsoft
。
返回值
字符串。
使用示例
结果:
结果:
UUIDToNum
接受一个 UUID 并返回其二进制表示,作为 FixedString(16),可选地指定 variant
(默认值为 Big-endian
)。此函数替代两个单独的函数调用 UUIDStringToNum(toString(uuid))
,因此无需从 UUID 转换为字符串以提取 UUID 的字节。
语法
参数
返回值
UUID 的二进制表示。
使用示例
结果:
结果:
UUIDv7ToDateTime
返回 UUID 版本 7 的时间戳组件。
语法
参数
返回值
- 精确到毫秒的时间戳。如果 UUID 不是有效的版本 7 UUID,则返回 1970-01-01 00:00:00.000。 DateTime64(3)。
使用示例
结果:
结果:
serverUUID
返回 ClickHouse 服务器首次启动时生成的随机 UUID。该 UUID 存储在 ClickHouse 服务器目录中的 uuid
文件中(例如 /var/lib/clickhouse/
),并在服务器重启之际保持不变。
语法
返回值
- 服务器的 UUID。 UUID。
generateSnowflakeID
生成一个 Snowflake ID。
生成的 Snowflake ID 包含当前的 Unix 时间戳(以毫秒为单位,41 + 1 个最高位的零),后跟机器 ID(10 位)和一个计数器(12 位),用于区分同一毫秒内的 ID。 对于任何给定的时间戳(unix_ts_ms),计数器从 0 开始,并为每个新 Snowflake ID 递增 1,直到时间戳发生变化。 如果计数器溢出,时间戳字段递增 1,计数器重置为 0。
函数 generateSnowflakeID
保证在并发执行的线程和查询中,时间戳内的计数器字段会单调递增。
生成的 Snowflake ID 基于 UNIX 纪元 1970-01-01。 尽管 Snowflake ID 的纪元没有标准或建议,但其他系统的实现可能使用不同的纪元,例如 Twitter/X(2010-11-04)或 Mastodon(2015-01-01)。
语法
参数
expr
— 一个任意的 表达式,用于跳过 公共子表达式消除,以避免在查询中多次调用函数。表达式的值对返回的 Snowflake ID 没有影响。可选。machine_id
— 机器 ID,最低的 10 位被使用。 Int64。可选。
返回值
类型为 UInt64 的值。
示例
首先,创建一个 UInt64 类型的列的表,然后将生成的 Snowflake ID 插入到表中。
结果:
每行生成多个 Snowflake ID 的示例
带有表达式和机器 ID 的示例
snowflakeToDateTime
此函数已废弃,仅在启用设置 allow_deprecated_snowflake_conversion_functions 的情况下使用。 该函数将来某个时候将被移除。
提取 Snowflake ID 的时间戳组件,格式为 DateTime。
语法
参数
返回值
value
的时间戳组件,作为 DateTime 值。
示例
查询:
结果:
snowflakeToDateTime64
此函数已废弃,仅在启用设置 allow_deprecated_snowflake_conversion_functions 的情况下使用。 该函数将来某个时候将被移除。
提取 Snowflake ID 的时间戳组件,格式为 DateTime64。
语法
参数
返回值
value
的时间戳组件,作为精确到毫秒的 DateTime64。
示例
查询:
结果:
dateTimeToSnowflake
此函数已废弃,仅在启用设置 allow_deprecated_snowflake_conversion_functions 的情况下使用。 该函数将来某个时候将被移除。
将 DateTime 值转换为给定时间的第一个 Snowflake ID。
语法
参数
value
— 带时间的日期。 DateTime。
返回值
- 输入值转换为 Int64 数据类型,作为该时间的第一个 Snowflake ID。
示例
查询:
结果:
dateTime64ToSnowflake
此函数已废弃,仅在启用设置 allow_deprecated_snowflake_conversion_functions 的情况下使用。 该函数将来某个时候将被移除。
将 DateTime64 转换为给定时间的第一个 Snowflake ID。
语法
参数
value
— 带时间的日期。 DateTime64。
返回值
- 输入值转换为 Int64 数据类型,作为该时间的第一个 Snowflake ID。
示例
查询:
结果:
snowflakeIDToDateTime
返回 Snowflake ID 的时间戳组件,作为 DateTime 类型的值。
语法
参数
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
。可选。 字符串。
返回值
value
的时间戳组件,作为 DateTime 值。
示例
查询:
结果:
snowflakeIDToDateTime64
返回 Snowflake ID 的时间戳组件,作为 DateTime64 类型的值。
语法
参数
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
。可选。 字符串。
返回值
value
的时间戳组件,作为精确到毫秒的 DateTime64。
示例
查询:
结果:
dateTimeToSnowflakeID
将 DateTime 值转化为给定时间的第一个 Snowflake ID。
语法
参数
value
— 带时间的日期。 DateTime。epoch
- Snowflake ID 的纪元,单位为毫秒,自 1970-01-01 起。默认值为 0(1970-01-01)。对于 Twitter/X 纪元(2015-01-01),提供 1288834974657。可选。 UInt*。
返回值
- 输入值转换为 UInt64 作为该时间的第一个 Snowflake ID。
示例
查询:
结果:
dateTime64ToSnowflakeID
将 DateTime64 转换为给定时间的第一个 Snowflake ID。
语法
参数
value
— 带时间的日期。 DateTime64。epoch
- Snowflake ID 的纪元,单位为毫秒,自 1970-01-01 起。默认值为 0(1970-01-01)。对于 Twitter/X 纪元(2015-01-01),提供 1288834974657。可选。 UInt*。
返回值
- 输入值转换为 UInt64 作为该时间的第一个 Snowflake ID。
示例
查询:
结果: