编码函数
char
返回一个字符串,其长度为传入参数的数量,每个字节的值均为相应参数的值。接受多个数值类型的参数。如果参数的值超出了 UInt8 数据类型的范围,则会转换为 UInt8,可能会发生取整和溢出。
语法
参数
返回值
- 给定字节的字符串。String。
示例
查询:
结果:
您可以通过传递相应的字节构建任意编码的字符串。以下是 UTF-8 的示例:
查询:
结果:
查询:
结果:
hex
返回一个包含参数的十六进制表示的字符串。
别名: HEX
。
语法
该函数使用大写字母 A-F
,并且不使用任何前缀(如 0x
)或后缀(如 h
)。
对于整数参数,它从最重要到最不重要的顺序打印十六进制数字(“半字节”)(大端序或“人类可读”顺序)。它从最重要的非零字节开始(省略前导零字节),但始终打印每个字节的两个数字,即使前导数字为零。
Date 和 DateTime 类型的值格式化为相应的整数(Date 为自纪元以来的天数,DateTime 为 Unix 时间戳的值)。
对于 String 和 FixedString,所有字节都简单编码为两个十六进制数字。零字节不会被省略。
Float 和 Decimal 类型的值编码为它们在内存中的表示。由于我们支持小端体系结构,因此它们以小端格式编码。前导/尾随零字节不会被省略。
UUID 类型的值按大端顺序字符串编码。
参数
返回值
- 一个包含参数的十六进制表示的字符串。String。
示例
查询:
结果:
查询:
结果:
查询:
结果:
查询:
结果:
unhex
执行 hex 的反操作。它将每对十六进制数字(在参数中)解释为一个数字,并将其转换为对应的字节。返回值是一个二进制字符串(BLOB)。
如果您想将结果转换为一个数字,可以使用 reverse 和 reinterpretAs<Type> 函数。
如果在 clickhouse-client
中调用 unhex
,二进制字符串将使用 UTF-8 显示。
别名: UNHEX
。
语法
参数
arg
— 一个包含任意数量十六进制数字的字符串。String, FixedString。
支持大写和小写字母 A-F
。十六进制数字的数量无需为偶数。如果是奇数,则最后一个数字将被解释为 00-0F
字节的最不重要一半。如果参数字符串中包含任何非十六进制数字,则返回某些实现定义的结果(不会抛出异常)。对于数值参数,unhex() 不会返回 hex(N) 的逆。
返回值
- 一个二进制字符串(BLOB)。String。
示例
查询:
结果:
查询:
结果:
bin
返回一个包含参数的二进制表示的字符串。
语法
别名: BIN
。
对于整数参数,它从最重要到最不重要的顺序打印二进制数字(大端序或“人类可读”顺序)。它从最重要的非零字节开始(省略前导零字节),但始终打印每个字节的八个数字,即使前导数字为零。
Date 和 DateTime 类型的值格式化为相应的整数(Date 为自纪元以来的天数,DateTime 为 Unix 时间戳的值)。
对于 String 和 FixedString,所有字节都简单编码为八个二进制数字。零字节不会被省略。
Float 和 Decimal 类型的值编码为它们在内存中的表示。由于我们支持小端体系结构,因此它们以小端格式编码。前导/尾随零字节不会被省略。
UUID 类型的值按大端顺序字符串编码。
参数
返回值
- 一个包含参数的二进制表示的字符串。String。
示例
查询:
结果:
查询:
结果:
查询:
结果:
查询:
结果:
unbin
将参数中的每对二进制数字解释为一个数字,并将其转换为对应的字节。该函数执行 bin 的反操作。
语法
别名: UNBIN
。
对于数值参数 unbin()
不返回 bin()
的逆。如果您想将结果转换为一个数字,可以使用 reverse 和 reinterpretAs<Type> 函数。
如果在 clickhouse-client
中调用 unbin
,二进制字符串将使用 UTF-8 显示。
支持二进制数字 0
和 1
。二进制数字的数量无需是八的倍数。如果参数字符串中包含任何非二进制数字,则返回某些实现定义的结果(不会抛出异常)。
参数
arg
— 一个包含任意数量二进制数字的字符串。String。
返回值
- 一个二进制字符串(BLOB)。String。
示例
查询:
结果:
查询:
结果:
bitmaskToList(num)
接受一个整数。返回一个字符串,包含当求和时等于源数的二的幂的列表。它们以逗号分隔,且没有空格,按升序排列。
bitmaskToArray(num)
接受一个整数。返回一个包含当求和时等于源数的二的幂的 UInt64 数字数组。数组中的数字按升序排列。
bitPositionsToArray(num)
接受一个整数并将其转换为无符号整数。返回一个包含 arg
中与 1
相等的位位置的 UInt64
数字列表的数组,按升序排列。
语法
参数
arg
— 整数值。Int/UInt。
返回值
示例
查询:
结果:
查询:
结果:
mortonEncode
计算无符号整数列表的 Morton 编码(ZCurve)。
该函数有两种操作模式:
- 简单
- 扩展
简单模式
接受最多 8 个无符号整数作为参数并生成一个 UInt64 代码。
语法
参数
args
: 最多 8 个 无符号整数 或上述类型的列。
返回值
- 一个 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 代码。
语法
参数
args
: 最多 2 个 无符号整数 或上述类型的列。
返回值
- 一个 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
的函数参数,而不是常量。
查询:
结果: