跳到主要内容
跳到主要内容

用于处理 UUID 的函数

generateUUIDv4

生成一个 版本 4 UUID

语法

参数

  • expr — 一个任意的 表达式,用于在查询中多次调用该函数时绕过 公共子表达式消除。表达式的值不会影响返回的 UUID。可选。

返回值

类型为 UUIDv4 的值。

示例

首先,创建一个列类型为 UUID 的表,然后将生成的 UUIDv4 插入该表。

结果:

示例,每行生成多个 UUID

generateUUIDv7

生成一个 版本 7 UUID

生成的 UUID 包含当前的 Unix 时间戳(毫秒,48位),后面是版本 “7”(4位),一个计数器(42位)用于区分同毫秒内的 UUID(包括一个变体字段 “2”,2位),和一个随机字段(32位)。 对于任何给定的时间戳 (unix_ts_ms),计数器从一个随机值开始,每生成一个新的 UUID 计数器加 1 直到时间戳改变。 如果计数器溢出,时间戳字段加 1,并将计数器重置为一个新的随机起始值。

函数 generateUUIDv7 保证在并发运行的线程和查询中,时间戳内的计数器字段单调递增。

备注

截至 2024 年 4 月,版本 7 的 UUID 处于草案状态,其布局可能在未来变化。

语法

参数

  • expr — 一个任意的 表达式,用于在查询中多次调用该函数时绕过 公共子表达式消除。表达式的值不会影响返回的 UUID。可选。

返回值

类型为 UUIDv7 的值。

示例

首先,创建一个列类型为 UUID 的表,然后将生成的 UUIDv7 插入该表。

结果:

示例,每行生成多个 UUID

empty

检查输入的 UUID 是否为空。

语法

如果 UUID 包含所有零(零 UUID),则视为为空。

该函数同样适用于 数组字符串

参数

  • x — 一个 UUID。 UUID

返回值

  • 如果 UUID 为空则返回 1,否则返回 0UInt8

示例

要生成 UUID 值,ClickHouse 提供了 generateUUIDv4 函数。

查询:

结果:

notEmpty

检查输入的 UUID 是否非空。

语法

如果 UUID 包含所有零(零 UUID),则视为为空。

该函数同样适用于 数组字符串

参数

  • x — 一个 UUID。 UUID

返回值

  • 如果 UUID 非空则返回 1,否则返回 0UInt8

示例

要生成 UUID 值,ClickHouse 提供了 generateUUIDv4 函数。

查询:

结果:

toUUID

将字符串类型的值转换为 UUID。

返回值

UUID 类型值。

用法示例

结果:

toUUIDOrDefault

参数

  • string — 由 36 个字符组成的字符串或 FixedString(36)。 String
  • default — 如果第一个参数无法转换为 UUID 类型时使用的默认 UUID。 UUID

返回值

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 个字符的 StringFixedString
  • variant — 整数,表示由 RFC4122 指定的变体。1 = Big-endian(默认),2 = Microsoft

返回值

FixedString(16)

用法示例

结果:

结果:

UUIDNumToString

接受一个 binary,包含 UUID 的二进制表示形式,其格式可选由 variant 指定(默认是 Big-endian),并返回一个包含 36 个字符的文本格式字符串。

语法

参数

  • binaryFixedString(16),作为 UUID 的二进制表示。
  • variant — 整数,表示由 RFC4122 指定的变体。1 = Big-endian(默认),2 = Microsoft

返回值

字符串。

用法示例

结果:

结果:

UUIDToNum

接受一个 UUID,并返回其二进制表示形式作为 FixedString(16),其格式可选由 variant 指定(默认是 Big-endian)。此函数取代对两个单独函数 UUIDStringToNum(toString(uuid)) 的调用,因此不需要从 UUID 转换为字符串来提取 UUID 的字节。

语法

参数

  • uuidUUID
  • variant — 整数,表示由 RFC4122 指定的变体。1 = Big-endian(默认),2 = Microsoft

返回值

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

Deprecated feature
危险

该函数已弃用,仅在开启设置 allow_deprecated_snowflake_conversion_functions 时方可使用。 该函数将在未来某个时刻被移除。

提取 Snowflake ID 的时间戳组件,格式为 DateTime

语法

参数

  • value — Snowflake ID。 Int64
  • time_zone时区。该函数根据时区解析 time_string。可选。 String

返回值

  • value 的时间戳组件,作为 DateTime 值。

示例

查询:

结果:

snowflakeToDateTime64

Deprecated feature
危险

该函数已弃用,仅在开启设置 allow_deprecated_snowflake_conversion_functions 时方可使用。 该函数将在未来某个时刻被移除。

提取 Snowflake ID 的时间戳组件,格式为 DateTime64

语法

参数

  • value — Snowflake ID。 Int64
  • time_zone时区。该函数根据时区解析 time_string。可选。 String

返回值

  • value 的时间戳组件,作为 DateTime64,精度为 3,即毫秒。

示例

查询:

结果:

dateTimeToSnowflake

Deprecated feature
危险

该函数已弃用,仅在开启设置 allow_deprecated_snowflake_conversion_functions 时方可使用。 该函数将在未来某个时刻被移除。

DateTime 值转换为给定时间的第一个 Snowflake ID

语法

参数

  • value — 带时间的日期。 DateTime

返回值

  • 输入值转换为 Int64 数据类型,作为该时刻的第一个 Snowflake ID。

示例

查询:

结果:

dateTime64ToSnowflake

Deprecated feature
危险

该函数已弃用,仅在开启设置 allow_deprecated_snowflake_conversion_functions 时方可使用。 该函数将在未来某个时刻被移除。

DateTime64 转换为给定时间的第一个 Snowflake ID

语法

参数

返回值

  • 输入值转换为 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。可选。 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。可选。 String

返回值

  • value 的时间戳组件,作为 DateTime64,精度为 3,即毫秒。

示例

查询:

结果:

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。

示例

查询:

结果:

另请参见