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

编码函数

char

返回长度与传入参数数量相同且每个字节值等于对应参数的字符串。接受多个数值类型参数。如果参数值超出 UInt8 数据类型的范围,则会转换为 UInt8,可能会发生四舍五入和溢出。

语法

参数

  • number_1, number_2, ..., number_n — 作为整数解释的数值参数。类型: Int, Float

返回值

  • 给定字节的字符串。 String

示例

查询:

结果:

您可以通过传递相应的字节构造任意编码的字符串。以下是 UTF-8 的示例:

查询:

结果:

查询:

结果:

hex

返回一个包含参数的十六进制表示的字符串。

别名: HEX

语法

该函数使用大写字母 A-F,并且不使用任何前缀(如 0x)或后缀(如 h)。

对于整数参数,它从最重要到最不重要(大端或“人类可读”顺序)打印十六进制数字(“半字节”)。它从最重要的非零字节开始(省略前导零字节),但总是打印每个字节的两个数字,即使前导数字为零。

DateDateTime 类型的值被格式化为相应的整数(自 Epoch 起的天数对于 Date,Unix 时间戳的值对于 DateTime)。

对于 StringFixedString,所有字节都简单地编码为两个十六进制数字。零字节不会被省略。

FloatDecimal 类型的值被编码为它们在内存中的表示。由于我们支持小端架构,因此它们以小端编码。前导/尾随零字节不会被省略。

UUID 类型的值被编码为大端顺序字符串。

参数

返回值

  • 一个字符串,包含参数的十六进制表示。 String

示例

查询:

结果:

查询:

结果:

查询:

结果:

查询:

结果:

unhex

执行 hex 的反操作。它将每对十六进制数字(在参数中)解释为一个数字,并将其转换为由该数字表示的字节。返回值是一个二进制字符串(BLOB)。

如果您想将结果转换为一个数字,可以使用 reversereinterpretAs<Type> 函数。

备注

如果在 clickhouse-client 中调用 unhex,二进制字符串将使用 UTF-8 显示。

别名: UNHEX

语法

参数

支持大写和小写字母 A-F。十六进制数字的数量不必是偶数。如果是奇数,则最后一个数字被解释为 00-0F 字节的最低有效半部分。如果参数字符串包含任何非十六进制数字,则返回某些实现定义的结果(不会抛出异常)。对于数值参数,unhex() 不会执行 hex(N) 的逆操作。

返回值

  • 一个二进制字符串(BLOB)。 String

示例

查询:

结果:

查询:

结果:

bin

返回一个包含参数的二进制表示的字符串。

语法

别名: BIN

对于整数参数,它从最重要到最不重要(大端或“人类可读”顺序)打印二进制数字。它从最重要的非零字节开始(省略前导零字节),但总是打印每个字节的八个数字,即使前导数字为零。

DateDateTime 类型的值被格式化为相应的整数(自 Date 起的天数和 DateTime 的 Unix 时间戳值)。

对于 StringFixedString,所有字节都简单地编码为八个二进制数字。零字节不会被省略。

FloatDecimal 类型的值被编码为它们在内存中的表示。由于我们支持小端架构,因此它们以小端编码。前导/尾随零字节不会被省略。

UUID 类型的值被编码为大端顺序字符串。

参数

返回值

  • 一个字符串,包含参数的二进制表示。 String

示例

查询:

结果:

查询:

结果:

查询:

结果:

查询:

结果:

unbin

解释参数中的每对二进制数字作为一个数字,并将其转换为由该数字表示的字节。该函数执行 bin 的反操作。

语法

别名: UNBIN

对于数值参数 unbin() 不会返回 bin() 的逆。如果您想将结果转换为一个数字,可以使用 reversereinterpretAs<Type> 函数。

备注

如果在 clickhouse-client 中调用 unbin,二进制字符串将使用 UTF-8 显示。

支持二进制数字 01。二进制数字的数量不必是八的倍数。如果参数字符串包含任何非二进制数字,则返回某些实现定义的结果(不会抛出异常)。

参数

  • arg — 包含任意数量二进制数字的字符串。 String

返回值

  • 一个二进制字符串(BLOB)。 String

示例

查询:

结果:

查询:

结果:

bitmaskToList(num)

接受一个整数。返回一个字符串,包含当求和时总计源数字的二的幂,以文本格式逗号分隔且没有空格,按升序排列。

bitmaskToArray(num)

接受一个整数。返回一个包含二的幂的 UInt64 数字数组,这些幂加总后为源数字。数组中的数字按升序排列。

bitPositionsToArray(num)

接受一个整数并将其转换为无符号整数。返回一个包含 arg 中等于 1 的位位置列表的 UInt64 数字数组,按升序排列。

语法

参数

返回值

  • 一个包含符合条件的位位置列表的数组,按升序排列。 Array(UInt64)。

示例

查询:

结果:

查询:

结果:

mortonEncode

计算无符号整数列表的 Morton 编码(ZCurve)。

该函数有两种操作模式:

  • 简单
  • 扩展

简单模式

接受最多 8 个无符号整数作为参数,并生成一个 UInt64 代码。

语法

参数

返回值

  • 一个 UInt64 代码。 UInt64

示例

查询:

结果:

扩展模式

接受一个范围掩码(tuple)作为第一个参数,以及最多 8 个 无符号整数 作为其他参数。

掩码中的每个数字配置范围扩展的量:
1 - 无扩展
2 - 2x 扩展
3 - 3x 扩展
...
最大扩展 8x。

语法

参数

  • range_mask: 1-8。
  • args: 最多 8 个 无符号整数 或上述类型的列。

注意: 使用列作为 args 时,提供的 range_mask 元组仍应为常量。

返回值

  • 一个 UInt64 代码。 UInt64

示例

范围扩展在您需要对具有截然不同范围(或基数)的参数进行相似分布时可能会很有帮助。 例如:'IP 地址' (0...FFFFFFFF) 和 '国家代码' (0...FF)。

查询:

结果:

注意: 元组大小必须与其他参数的数量相等。

示例

一个参数的 Morton 编码始终是该参数本身:

查询:

结果:

示例

也可以扩展一个参数:

查询:

结果:

示例

您还可以在函数中使用列名称。

首先创建表并插入一些数据。

使用列名称而不是常量作为 mortonEncode 的函数参数

查询:

结果:

实现细节

请注意,您只能在 Morton 代码中放入 UInt64 所能容纳的比特信息。两个参数的范围最大为 2^32 (64/2),三个参数的范围最大为 2^21 (64/3),依此类推。所有溢出将被限制为零。

mortonDecode

将 Morton 编码(ZCurve)解码为相应的无符号整数元组。

mortonEncode 函数一样,该函数有两种操作模式:

  • 简单
  • 扩展

简单模式

接受一个结果元组大小作为第一个参数,代码作为第二个参数。

语法

参数

  • tuple_size: 不超过 8 的整数值。
  • code: UInt64 代码。

返回值

示例

查询:

结果:

扩展模式

接受一个范围掩码(元组)作为第一个参数,代码作为第二个参数。 掩码中的每个数字配置范围缩小的量:
1 - 无缩小
2 - 2x 缩小
3 - 3x 缩小
...
最大缩小 8x。

范围扩展在您需要对具有截然不同范围(或基数)的参数进行相似分布时可能会很有帮助。 例如:'IP 地址' (0...FFFFFFFF) 和 '国家代码' (0...FF)。 与编码函数一样,最多限于 8 个数字。

示例

查询:

结果:

示例

也可以缩小一个参数:

查询:

结果:

示例

您还可以在函数中使用列名称。

首先创建表并插入一些数据。

查询:

使用列名称而不是常量作为 mortonDecode 的函数参数

查询:

结果:

hilbertEncode

计算一组无符号整数的 Hilbert 曲线编码。

该函数有两种操作模式:

  • 简单
  • 扩展

简单模式

简单: 接受最多 2 个无符号整数作为参数,并生成一个 UInt64 代码。

语法

参数

返回值

  • 一个 UInt64 代码

类型: UInt64

示例

查询:

结果:

扩展模式

接受一个范围掩码(tuple)作为第一个参数,以及最多 2 个 无符号整数 作为其他参数。

掩码中的每个数字配置对应参数向左移动的位数,从而在其范围内缩放参数。

语法

参数

注意: 使用列作为 args 时,提供的 range_mask 元组仍应为常量。

返回值

  • 一个 UInt64 代码

类型: UInt64

示例

范围扩展在您需要对具有截然不同范围(或基数)的参数进行相似分布时可能会很有帮助。 例如:'IP 地址' (0...FFFFFFFF) 和 '国家代码' (0...FF)。

查询:

结果:

注意: 元组大小必须与其他参数的数量相等。

示例

对于没有元组的单一参数,函数返回该参数本身作为 Hilbert 索引,因为不需要维度映射。

查询:

结果:

示例

如果提供了一个单一参数,并带有指定位移的元组,则函数会将参数向左移动指定的位数。

查询:

结果:

示例

该函数还接受列作为参数:

首先创建表并插入一些数据。

使用列名称而不是常量作为 hilbertEncode 的函数参数

查询:

结果:

实现细节

请注意,您只能在 Hilbert 代码中放入 UInt64 所能容纳的比特信息。两个参数的范围最大为 2^32 (64/2)。所有溢出将被限制为零。

hilbertDecode

将 Hilbert 曲线索引解码回无符号整数元组,表示多维空间中的坐标。

hilbertEncode 函数一样,该函数有两种操作模式:

  • 简单
  • 扩展

简单模式

接受最多 2 个无符号整数作为参数,并生成一个 UInt64 代码。

语法

参数

  • tuple_size: 不超过 2 的整数值。
  • code: UInt64 代码。

返回值

  • 指定大小的 tuple

类型: UInt64

示例

查询:

结果:

扩展模式

接受一个范围掩码(元组)作为第一个参数,最多 2 个无符号整数作为其他参数。 掩码中的每个数字配置对应参数向左移动的位数,从而在其范围内缩放参数。

范围扩展在您需要对具有截然不同范围(或基数)的参数进行相似分布时可能会很有帮助。 例如:'IP 地址' (0...FFFFFFFF) 和 '国家代码' (0...FF)。 与编码函数一样,最多限于 8 个数字。

示例

Hilbert 代码对于一个参数始终为该参数本身(作为元组)。

查询:

结果:

示例

单一参数与指定位移的元组将相应右移。

查询:

结果:

示例

该函数接受代码列作为第二个参数:

首先创建表并插入一些数据。

查询:

使用列名称而不是常量作为 hilbertDecode 的函数参数

查询:

结果:

bech32Encode

将二进制数据字符串以及人类可读部分(HRP)编码,使用 Bech32 或 Bech32m 算法。

语法

参数

  • hrp — 指定代码的“人类可读部分”的 1 - 83 个小写字母字符串。通常是 'bc' 或 'tb'。 StringFixedString
  • data — 要编码的二进制数据字符串。 StringFixedString
  • witver - 见证版本。可选,默认 = 1。一个 UInt*,指定要运行的算法版本。0 表示 Bech32,1 或更高表示 Bech32m。
备注

使用 FixedString 数据类型时,如果一个值未完全填充行,它将被填充为 null 字符。 虽然 bech32Encode 函数会自动处理 hrp 参数,但对于数据参数,值不得填充。 因此,不建议将 FixedString 数据类型用于您的数据值,除非您确定它们都具有相同的长度,并确保您的 FixedString 列也设置为该长度。

返回值

  • 一个 Bech32 地址字符串,由人类可读部分、分隔符(始终为 '1')和数据部分组成。字符串的长度永远不会超过 90 个字符。如果算法无法从输入生成有效地址,则会返回空字符串。

类型: String

示例

当未提供见证版本时,默认为 1,即更新的 Bech32m 算法。

查询:

结果:

见证版本为 0 将导致不同的地址字符串。

查询:

结果:

虽然 'bc'(主网)和 'tb'(测试网)是 SegWit 地址格式中唯一允许的 hrp 值,但 Bech32 允许任何满足上述要求的 hrp。

查询:

结果:

bech32Decode

解码由 bech32 或 bech32m 算法生成的 Bech32 地址字符串。

语法

参数

备注

与 encode 函数不同,Bech32Decode 将自动处理填充的 FixedStrings

返回值

  • 由 (hrp, data) 组成的元组,用于编码该字符串。数据以二进制格式表示。

类型: (String, String)。

示例

查询:

结果:

查询:

结果: