编码函数
bech32Decode
引入版本:v25.6
对由 bech32 或 bech32m 算法生成的 Bech32 地址字符串进行解码。
与编码函数不同,Bech32Decode 会自动处理带填充的 FixedString。
语法
参数
address— 要解码的 Bech32 字符串。String或FixedString
返回值
返回一个元组 (hrp, data),其中包含用于编码该字符串的值。data 为二进制格式。Tuple(String, String)
示例
解码地址
测试网地址
bech32Encode
自 v25.6 起引入
使用 Bech32 或 Bech32m 算法对二进制数据字符串及其人类可读部分(HRP)进行编码。
在使用 FixedString 数据类型时,如果某个值没有完全填满其定义的长度,将会用空字符(null 字符)进行填充。
对于 hrp 参数,bech32Encode 函数会自动处理这种情况,但对于 data 参数,值不能包含这些填充字符。
因此,不建议对数据值使用 FixedString 数据类型,除非能够确保它们的长度完全相同,并相应地将 FixedString 列的长度设置为该值。
语法
参数
hrp— 一个由1 - 83个小写字符组成的字符串,用于指定代码的“human-readable part(人类可读部分)”。通常为 'bc' 或 'tb'。String或FixedStringdata— 要编码的二进制数据字符串。String或FixedStringwitver— 可选。见证版本(默认 = 1)。一个UInt*,用于指定要运行的算法版本。0对应 Bech32,1或更大对应 Bech32m。UInt*
返回值
返回一个 Bech32 地址字符串,由 human-readable part、一个始终为 '1' 的分隔符字符,以及数据部分组成。该字符串的长度不会超过 90 个字符。如果算法无法从输入中生成有效地址,则返回空字符串。String
示例
默认 Bech32m
Bech32 算法
自定义 HRP
bin
引入于:v21.8
根据不同类型,按照以下逻辑返回一个包含参数二进制表示形式的字符串:
| Type | Description |
|---|---|
(U)Int* | 以从最高有效位到最低有效位(大端序或“人类可读”顺序)输出二进制位。输出时从最高有效的非零字节开始(省略前导零字节),但如果该字节的最高位为零,仍然为该字节输出完整的 8 位二进制数字。 |
Date and DateTime | 格式化为对应的整数(Date 为自纪元(epoch)起的天数,DateTime 为 Unix 时间戳的值)。 |
String and FixedString | 所有字节都直接编码为 8 位二进制数字。零字节不会被省略。 |
Float* and Decimal | 按其在内存中的表示进行编码。由于我们使用的是小端序架构,因此按小端序进行编码。前导或尾随的零字节不会被省略。 |
UUID | 按大端序顺序编码为字符串。 |
语法
参数
返回值
返回参数二进制表示形式的字符串。String
示例
简单的整数
Float32 浮点数
Float64 浮点数
UUID 转换
bitPositionsToArray
自 v21.7 引入
该函数返回无符号整数二进制表示中所有值为 1 的位的位置(按升序排列)。 带符号的输入整数会先被转换为无符号整数。
语法
参数
arg— 一个整数值。(U)Int*
返回值
返回一个数组,数组元素为输入值二进制表示中所有为 1 的位的位置,按升序排列。Array(UInt64)
示例
单个位被设置为 1
所有比特位已置 1
bitmaskToArray
引入版本:v1.1
此函数将一个整数分解为若干个 2 的幂之和。 这些 2 的幂以升序排列的数组形式返回。
语法
参数
num— 一个整数值。(U)Int*
返回值
返回一个数组,其中包含按升序排列的 2 的幂,其和等于输入值。Array(UInt64)
示例
基础示例
单一 2 的幂值
bitmaskToList
引入版本:v1.1
类似 bitmaskToArray,但返回的是由 2 的幂值组成、以逗号分隔的字符串。
语法
参数
num— 整数。(U)Int*
返回值
返回一个包含用逗号分隔的 2 的幂的字符串。String
示例
基本示例
char
引入版本:v20.1
返回一个长度等于传入参数个数的字符串,其中每个字节的值等于对应参数的值。接受多个数值类型的参数。
如果参数的值超出了 UInt8 数据类型的范围,则会被转换为 UInt8,在此过程中可能发生舍入和溢出。
语法
参数
num1[, num2[, num3 ...]]— 按整数处理的数值参数。(U)Int8/16/32/64或Float*
返回值
返回由给定字节组成的字符串。String
示例
基本示例
构建任意编码
hex
引入于:v1.1
根据不同类型,按以下逻辑返回一个包含参数十六进制表示形式的字符串:
| Type | Description |
|---|---|
(U)Int* | 按从最高有效位到最低有效位的顺序(大端或“人类可读”顺序)输出十六进制数字(“半字节 / nibbles”)。从最高有效的非零字节开始(会省略前导零字节),但始终输出每个字节的两个数字,即使高位数字为零。 |
Date and DateTime | 格式化为对应的整数(对于 Date,是自纪元起的天数;对于 DateTime,是 Unix 时间戳的值)。 |
String and FixedString | 所有字节都直接编码为两个十六进制数字。零字节不会被省略。 |
Float* and Decimal | 按其在内存中的表示进行编码。ClickHouse 在内部始终以小端格式表示这些值,因此也按小端方式进行编码。前导或尾随的零字节不会被省略。 |
UUID | 按大端顺序编码为字符串。 |
该函数使用大写字母 A-F,且不使用任何前缀(如 0x)或后缀(如 h)。
语法
参数
返回值
返回一个以十六进制表示该参数的字符串。String
示例
简单整数
Float32 浮点数
Float64 浮点数
UUID 转换
hilbertDecode
引入版本:v24.6
将 Hilbert 曲线索引解码回由无符号整数组成的元组,表示多维空间中的坐标。
与 hilbertEncode 函数一样,此函数有两种运行模式:
- 简单
- 扩展
简单模式
接受最多 2 个无符号整数作为参数,并生成一个 UInt64 代码。
扩展模式
接受一个范围掩码(元组)作为第一个参数,以及最多 2 个无符号整数作为 其他参数。掩码中的每个数字用于配置对应参数左移的位数,从而在其范围内对参数进行 有效缩放。
当你需要对范围(或基数)差异巨大的参数获得相似分布时,范围扩展会很有用。
例如:'IP Address' (0...FFFFFFFF) 和 'Country code' (0...FF)。
与编码函数相同,此模式最多支持 8 个数字。
语法
参数
tuple_size— 不大于2的整数值。UInt8/16/32/64或Tuple(UInt8/16/32/64)code—UInt64类型的编码值。UInt64
返回值
返回一个指定大小的元组。Tuple(UInt64)
示例
简单模式
单一参数
展开模式
列使用情况
hilbertEncode
引入版本:v24.6
为一组无符号整数计算 Hilbert 曲线编码。
该函数有两种工作模式:
- 简单模式
- 扩展模式
简单模式
接受最多 2 个无符号整数作为参数,并生成一个 UInt64 编码。
扩展模式
接受一个范围掩码(Tuple)作为 第一个参数,并将最多 2 个无符号整数 作为其余参数。
掩码中的每个数字用于配置对应参数左移的位数,从而在其范围内按比例缩放该参数。
语法
参数
args— 至多两个UInt值或UInt类型的列。UInt8/16/32/64range_mask— 在扩展模式下,至多两个UInt值或UInt类型的列。UInt8/16/32/64
返回值
返回一个 UInt64 值。UInt64
示例
简单模式
展开模式
单个参数
展开的单参数形式
列用法
mortonDecode
引入于:v24.6
将 Morton 编码(Z 曲线)解码为对应的无符号整数元组。
与 mortonEncode 函数一样,此函数有两种运行模式:
- 简单
- 扩展
简单模式
第一个参数为结果元组的大小,第二个参数为编码值。
扩展模式
第一个参数为范围掩码(元组),第二个参数为编码值。 掩码中的每个数字用于配置范围收缩的倍数:
1- 不收缩2- 2 倍收缩3- 3 倍收缩 ⋮- 最多到 8 倍收缩。
当参数的取值范围(或基数)差异很大,但仍希望它们具有相近的分布时,范围扩展会很有用。
例如:“IP Address” (0...FFFFFFFF) 和 “Country code” (0...FF)。
与编码函数一样,此功能最多只能处理 8 个数字。
语法
参数
tuple_size— 不大于 8 的整数值。UInt8/16/32/64range_mask— 在扩展模式下,用于配置每个参数的掩码。该掩码是一个无符号整数的元组。掩码中的每个数值用于配置区间收缩的程度。Tuple(UInt8/16/32/64)code— UInt64 代码值。UInt64
返回值
返回一个指定大小的元组。Tuple(UInt64)
示例
简单模式
单个参数
扩展模式:缩减一个参数
列使用情况
mortonEncode
引入于:v24.6
为一组无符号整数计算 Morton 编码(Z 曲线,ZCurve)。
该函数有两种运行模式:
- 简单模式
- 扩展模式*
简单模式
最多接受 8 个无符号整数作为参数,并生成一个 UInt64 编码。
扩展模式
接受一个范围掩码(Tuple)作为第一个参数,以及最多 8 个无符号整数作为其余参数。
掩码中的每个数字用于配置对应维度的范围扩展倍数:
- 1 - 不扩展
- 2 - 2 倍扩展
- 3 - 3 倍扩展 ⋮
- 最多 8 倍扩展。
语法
参数
args— 最多包含 8 个无符号整数或上述类型的列。UInt8/16/32/64range_mask— 在扩展模式下,用于指定每个参数的掩码。该掩码是由1-8的无符号整数组成的元组。掩码中的每个数字用于配置区间收缩的程度。Tuple(UInt8/16/32/64)
返回值
返回一个 UInt64 编码值。UInt64
示例
简单模式
展开模式
单个参数
单参数扩展形式
列使用情况
sqidDecode
首次引入于:v24.1
将一个 sqid 解码还原为数字数组。
语法
参数
sqid— 要解码的 sqid。String
返回值
返回由 sqid 解码得到的数字数组。Array(UInt64)
示例
使用示例
sqidEncode
自 v24.1 起引入
将数字转换为 sqid,一种类似 YouTube 的 ID 字符串。
语法
别名:sqid
参数
n1[, n2, ...]— 任意数量的数字。UInt8/16/32/64
返回值
返回一个哈希 ID 字符串 String
示例
用法示例
unbin
引入于:v21.8
将参数中的每一对二进制数字解释为一个数值,并将其转换为该数值所表示的字节。该函数执行与 bin 相反的操作。
对于数值型参数,unbin() 不会返回 bin() 的逆结果。如果你希望将结果转换为数值,可以使用 reverse 和 reinterpretAs<Type> 函数。
如果在 clickhouse-client 中调用 unbin,二进制字符串将以 UTF-8 方式显示。
支持二进制数字 0 和 1。二进制数字的位数不必是 8 的倍数。如果参数字符串包含二进制数字以外的任何内容,其结果未定义(不会抛出异常)。
语法
参数
arg— 一个由任意数量二进制位组成的字符串。String
返回值
返回一个二进制字符串(BLOB)。String
示例
基本用法
转换为数值
unhex
引入版本:v1.1
执行与 hex 相反的操作。它将参数中的每一对十六进制数字解释为一个数值,并将其转换为该数值所表示的字节。返回值是一个二进制字符串(BLOB)。
如果你希望将结果转换为数值,可以使用 reverse 和 reinterpretAs<Type> 函数。
clickhouse-client 将字符串解释为 UTF-8。
这可能会导致 hex 返回的值在显示时与预期不符。
同时支持大写和小写字母 A-F。
十六进制数字的数量不必为偶数。
如果是奇数,最后一个数字会被解释为 00-0F 字节中最低有效的半字节。
如果参数字符串包含十六进制数字以外的任何内容,将返回某种依赖实现的结果(不会抛出异常)。
对于数值类型参数,unhex() 不会执行 hex(N) 的逆运算。
语法
参数
arg— 一个包含任意数量的十六进制数字的字符串。String或FixedString
返回值
返回一个二进制字符串(BLOB)。String
示例
基本用法
转换为数值