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

编码函数

char

返回一个字符串,其长度为传入参数的数量,每个字节的值均为相应参数的值。接受多个数值类型的参数。如果参数的值超出了 UInt8 数据类型的范围,则会转换为 UInt8,可能会发生取整和溢出。

语法

参数

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

返回值

  • 给定字节的字符串。String

示例

查询:

结果:

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

查询:

结果:

查询:

结果:

hex

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

别名: HEX

语法

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

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

DateDateTime 类型的值格式化为相应的整数(Date 为自纪元以来的天数,DateTime 为 Unix 时间戳的值)。

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

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

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

参数

返回值

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

示例

查询:

结果:

查询:

结果:

查询:

结果:

查询:

结果:

unhex

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

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

备注

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

别名: UNHEX

语法

参数

  • arg — 一个包含任意数量十六进制数字的字符串。String, FixedString

支持大写和小写字母 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 数字列表的数组,按升序排列。

语法

参数

返回值

  • 一个包含与 1 相等的位位置列表的数组,按升序排列。Array(UInt64)。

示例

查询:

结果:

查询:

结果:

mortonEncode

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

该函数有两种操作模式:

  • 简单
  • 扩展

简单模式

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

语法

参数

返回值

  • 一个 UInt64 代码。UInt64

示例

查询:

结果:

扩展模式

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

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

语法

参数

  • 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 - 2 倍缩短
3 - 3 倍缩短
...
最多可缩短 8 倍。

范围扩展在参数具有截然不同的范围(或基数)时可以带来相似的分布。 例如:“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 的函数参数,而不是常量。

查询:

结果: