Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

编码函数

bech32Decode

引入版本:v25.6.0

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

语法

bech32Decode(address[, 'raw'])

参数

  • address — 要解码的 Bech32 字符串。StringFixedString
  • mode — 可选。传入 'raw' 可在解码时不将第一个字节剥离为见证版本。对于非 SegWit 地址 (例如 Cosmos SDK) ,请使用此选项。String

返回值

返回一个 (hrp, data) Tuple,表示编码该字符串时使用的值。data 采用二进制格式。Tuple(String, String)

示例

解码地址

SELECT tup.1 AS hrp, hex(tup.2) AS data FROM (SELECT bech32Decode('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4') AS tup)
┌─hrp─┬─data─────────────────────────────────────┐
│ bc  │ 751E76E8199196D454941C45D1B3A323F1433BD6 │
└─────┴──────────────────────────────────────────┘

测试网地址

SELECT tup.1 AS hrp, hex(tup.2) AS data FROM (SELECT bech32Decode('tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx') AS tup)
┌─hrp─┬─data─────────────────────────────────────┐
│ tb  │ 751E76E8199196D454941C45D1B3A323F1433BD6 │
└─────┴──────────────────────────────────────────┘

bech32Encode

引入版本:v25.6.0

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

语法

bech32Encode(hrp, data[, witver | 'bech32' | 'bech32m'])

参数

  • hrp — 由 1 - 83 个小写字符组成的 String,用于指定编码中的“可读部分”。通常为 'bc' 或 'tb'。StringFixedString
  • data — 要编码的二进制数据 String。StringFixedString
  • witver_or_variant — 可选。可以是 UInt* 见证版本 (默认值为 1,Bech32 为 0,Bech32m 为 1+) ,也可以是 String 编码变体:'bech32' (BIP173) 或 'bech32m' (BIP350) 。使用字符串变体时,不会预加见证版本字节——这对于 Cosmos SDK 等非 SegWit 地址是必需的。UInt*String

返回值

返回一个 Bech32 地址字符串,由可读部分、一个始终为 '1' 的分隔符字符以及数据部分组成。该字符串长度不会超过 90 个字符。如果算法无法根据输入生成有效地址,则返回空字符串。String

示例

默认 Bech32m

-- When no witness version is supplied, the default is 1, the updated Bech32m algorithm.
SELECT bech32Encode('bc', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'))
bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kj9wkru

Bech32 算法

-- A witness version of 0 will result in a different address string.
SELECT bech32Encode('bc', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'), 0)
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4

自定义 HRP

-- While 'bc' (Mainnet) and 'tb' (Testnet) are the only allowed hrp values for the
-- SegWit address format, Bech32 allows any hrp that satisfies the above requirements.
SELECT bech32Encode('abcdefg', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'), 10)
abcdefg12w508d6qejxtdg4y5r3zarvary0c5xw7kh526px

Cosmos SDK 地址 (BIP173,不含见证版本)

-- Using 'bech32' variant encodes raw data without a witness version byte,
-- compatible with Cosmos SDK, Injective, Osmosis, and other non-SegWit chains.
SELECT bech32Encode('inj', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'), 'bech32')
inj1w508d6qejxtdg4y5r3zarvary0c5xw7ks5q7aq

bin

引入版本:v21.8.0

根据不同类型按以下规则,返回一个包含参数二进制表示的字符串:

类型 描述
(U)Int* 按从最高有效位到最低有效位的顺序 (大端序或“人类可读”顺序) 输出二进制数字。从最高的非零字节开始输出 (省略前导零字节) ,但如果某个字节的最高位为零,仍始终输出该字节完整的八位数字。
Date and DateTime 格式化为对应的整数 (Date 为自纪元以来的天数,DateTime 为 Unix 时间戳值) 。
String and FixedString 所有字节都会直接编码为 8 位二进制数,不会省略零字节。
Float* and Decimal 按它们在内存中的表示进行编码。由于支持小端架构,因此按小端序编码。不会省略前导或尾随零字节。
UUID 按大端序字符串编码。

语法

bin(arg)

参数

返回值

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

示例

简单整数

SELECT bin(14)
┌─bin(14)──┐
│ 00001110 │
└──────────┘

Float32 数字

SELECT bin(toFloat32(number)) AS bin_presentation FROM numbers(15, 2)
┌─bin_presentation─────────────────┐
│ 00000000000000000111000001000001 │
│ 00000000000000001000000001000001 │
└──────────────────────────────────┘

Float64 数值

SELECT bin(toFloat64(number)) AS bin_presentation FROM numbers(15, 2)
┌─bin_presentation─────────────────────────────────────────────────┐
│ 0000000000000000000000000000000000000000000000000010111001000000 │
│ 0000000000000000000000000000000000000000000000000011000001000000 │
└──────────────────────────────────────────────────────────────────┘

UUID 转换

SELECT bin(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0')) AS bin_uuid
┌─bin_uuid─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 01100001111100001100010000000100010111001011001100010001111001111001000001111011101001100000000001101010110100111101101110100000 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

bitPositionsToArray

引入版本:v21.7.0

此函数返回无符号整数的二进制表示中值为 1 的位的位置 (按升序排列) 。 有符号输入整数会先转换为无符号整数。

语法

bitPositionsToArray(arg)

参数

  • arg — 一个整数值。(U)Int*

返回值

返回一个数组,包含输入值的二进制表示中值为 1 的各个位的位置,并按升序排列。Array(UInt64)

示例

单个位被设置

SELECT bitPositionsToArray(toInt8(1)) AS bit_positions
┌─bit_positions─┐
│ [0]           │
└───────────────┘

所有位均已置位

SELECT bitPositionsToArray(toInt8(-1)) AS bit_positions
┌─bit_positions─────┐
│ [0,1,2,3,4,5,6,7] │
└───────────────────┘

bitmaskToArray

引入版本:v1.1.0

此函数将一个整数分解为若干个 2 的幂之和。 这些 2 的幂会以按升序排列的数组形式返回。

语法

bitmaskToArray(num)

参数

返回值

返回一个数组,其中包含按升序排列且其和等于输入数字的 2 的幂。Array(UInt64)

示例

基本示例

SELECT bitmaskToArray(50) AS powers_of_two
┌─powers_of_two─┐
│ [2,16,32]     │
└───────────────┘

单个 2 的幂值

SELECT bitmaskToArray(8) AS powers_of_two
┌─powers_of_two─┐
│ [8]           │
└───────────────┘

bitmaskToList

引入版本:v1.1.0

与 bitmaskToArray 类似,但返回由 2 的幂组成的逗号分隔字符串。

语法

bitmaskToList(num)

参数

返回值

返回一个包含以逗号分隔的 2 的幂值的字符串。String

示例

基本示例

SELECT bitmaskToList(50) AS powers_list
┌─powers_list─┐
│ 2,16,32     │
└─────────────┘

char

引入版本:v20.1.0

返回一个字符串,其长度等于传入参数的个数,其中每个字节 的值都对应相应参数的值。接受多个数值类型参数。

如果参数值超出 UInt8 数据类型的取值范围,则会将其转换为 UInt8,此过程中可能发生舍入和溢出。

语法

char(num1[, num2[, ...]])

参数

返回值

返回由给定字节构成的字符串。String

示例

基础示例

SELECT char(104.1, 101, 108.9, 108.9, 111) AS hello;
┌─hello─┐
│ hello │
└───────┘

构建任意编码

-- 您可以通过传入相应的字节来构造任意编码的字符串。
-- 例如 UTF8
SELECT char(0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82) AS hello;
┌─hello──┐
│ привет │
└────────┘

hex

引入版本:v1.1.0

根据以下针对不同类型的规则,返回一个包含参数十六进制表示的字符串:

Type Description
(U)Int* 按十六进制数字 ("半字节") 从高位到低位的顺序输出 (大端序,即"人类可读"顺序) 。从最高的非零字节开始输出 (省略前导零字节) ,但每个字节始终都会输出两位,即使高位数字为 0 也不例外。
Date and DateTime 格式化为对应的整数 (Date 为自纪元以来的天数,DateTime 为 Unix timestamp 的值) 。
String and FixedString 所有字节都会直接编码为两个十六进制数字。不会省略零字节。
Float* and Decimal 按它们在内存中的表示形式进行编码。ClickHouse 在内部始终以小端序表示这些值,因此编码结果也是小端序。不会省略前导或尾随的零字节。
UUID 编码为大端序字符串。

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

语法

hex(arg)

参数

返回值

返回参数的十六进制表示形式的字符串。String

示例

简单整数

SELECT hex(1)
01

Float32 数值

SELECT hex(toFloat32(number)) AS hex_presentation FROM numbers(15, 2)
┌─hex_presentation─┐
│ 00007041         │
│ 00008041         │
└──────────────────┘

Float64 数值

SELECT hex(toFloat64(number)) AS hex_presentation FROM numbers(15, 2)
┌─hex_presentation─┐
│ 0000000000002E40 │
│ 0000000000003040 │
└──────────────────┘

UUID 转换

SELECT lower(hex(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0'))) AS uuid_hex
┌─uuid_hex─────────────────────────┐
│ 61f0c4045cb311e7907ba6006ad3dba0 │
└──────────────────────────────────┘

hilbertDecode

引入版本:v24.6.0

将 Hilbert 曲线索引解码回一个由无符号整数组成的 Tuple,用于表示多维空间中的坐标。

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

  • 简单模式
  • 扩展模式

简单模式

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

扩展模式

接受一个范围掩码 (Tuple) 作为第一个参数,以及最多 2 个无符号整数作为 其他参数。掩码中的每个数都用于指定对应参数左移的位数, 从而在其取值范围内对该参数进行缩放。

当你希望取值范围 (或基数) 差异很大的 参数具有相近的分布时,范围扩展会很有帮助。例如:'IP Address' (0...FFFFFFFF) 和 '国家/地区代码' (0...FF)。与编码函数一样,这最多仅限于 8 个 数值。

语法

hilbertDecode(tuple_size, code)

参数

返回值

返回指定长度的 Tuple。Tuple(UInt64)

示例

简单模式

SELECT hilbertDecode(2, 31)
(3,4)

单个参数

-- Hilbert code for one argument is always the argument itself (as a tuple).
SELECT hilbertDecode(1, 1)
(1)

扩展模式

-- A single argument with a tuple specifying bit shifts will be right-shifted accordingly.
SELECT hilbertDecode(tuple(2), 32768)
(8192)

列的用法

-- First create the table and insert some data
CREATE TABLE hilbert_numbers(
    n1 UInt32,
    n2 UInt32
)
ENGINE=MergeTree()
ORDER BY n1 SETTINGS index_granularity_bytes = '10Mi';
insert into hilbert_numbers (*) values(1,2);

-- Use column names instead of constants as function arguments
SELECT untuple(hilbertDecode(2, hilbertEncode(n1, n2))) FROM hilbert_numbers;
1	2

hilbertEncode

引入于:v24.6.0

计算一组无符号整数对应的希尔伯特曲线编码。

该函数有两种工作模式:

  • 简单
  • 扩展

简单模式

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

扩展模式

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

掩码中的每个数都会指定对应参数左移的位数, 从而在其范围内对该参数进行缩放。

语法

-- 简单模式
hilbertEncode(args)

-- 扩展模式
hilbertEncode(range_mask, args)

参数

  • args — 最多两个 UInt 值,或 UInt 类型的列。UInt8/16/32/64
  • range_mask — 在扩展模式下,最多两个 UInt 值,或 UInt 类型的列。UInt8/16/32/64

返回值

返回一个 UInt64 编码值。UInt64

示例

简单模式

SELECT hilbertEncode(3, 4)
31

扩展模式

-- 当参数的取值范围(或基数)差异悬殊时,范围扩展有助于实现相近的分布。
-- 例如:'IP Address'(0...FFFFFFFF)与 'Country code'(0...FF)。
-- 注意:Tuple 的大小必须与其他参数的数量相等。
SELECT hilbertEncode((10, 6), 1024, 16)
4031541586602

单个参数

-- 对于不带元组的单个参数,函数将直接返回该参数本身作为 Hilbert 索引,因为无需进行维度映射。
SELECT hilbertEncode(1)
1

扩展的单参数

-- 如果提供单个参数并附带指定移位量的 Tuple,该函数将把参数向左移位指定的位数。
SELECT hilbertEncode(tuple(2), 128)
512

列的用法

-- 首先创建表并插入一些数据
CREATE TABLE hilbert_numbers(
    n1 UInt32,
    n2 UInt32
)
ENGINE=MergeTree()
ORDER BY n1;
insert into hilbert_numbers (*) values(1, 2);

-- 使用列名而非常量作为函数参数
SELECT hilbertEncode(n1, n2) FROM hilbert_numbers;
13

mortonDecode

引入版本:v24.6.0

将 Morton 编码 (ZCurve) 解码为对应的无符号整数 Tuple。

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

  • 简单模式
  • 扩展模式

简单模式

接受结果 Tuple 的大小作为第一个参数,编码值作为第二个参数。

扩展模式

接受范围掩码 (Tuple) 作为第一个参数,编码值作为第二个参数。 掩码中的每个数字用于配置范围收缩的幅度:

  • 1 - 不收缩
  • 2 - 收缩 2 倍
  • 3 - 收缩 3 倍 ⋮
  • 最多收缩 8 倍。

当你需要让取值范围 (或基数) 差异很大的参数获得相似的分布时, 范围扩展会很有帮助。例如:'IP Address' (0...FFFFFFFF) 和 '国家/地区代码' (0...FF)。与编码函数一样,这里最多也只支持 8 个数字。

语法

-- Simple mode
mortonDecode(tuple_size, code)

-- Expanded mode
mortonDecode(range_mask, code)

参数

  • tuple_size — 不大于 8 的整数值。UInt8/16/32/64
  • range_mask — 在扩展模式中,每个参数对应的掩码。该掩码是一个由无符号整数组成的 Tuple。掩码中的每个数值用于配置范围收缩量。Tuple(UInt8/16/32/64)
  • code — UInt64 编码。UInt64

返回值

返回一个指定大小的 Tuple。Tuple(UInt64)

示例

简单模式

SELECT mortonDecode(3, 53)
(1,2,3)

单个参数

SELECT mortonDecode(1, 1)
(1)

扩展模式:缩小一个参数

SELECT mortonDecode(tuple(2), 32768)
(128)

列用法

-- First create the table and insert some data
CREATE TABLE morton_numbers(
    n1 UInt32,
    n2 UInt32,
    n3 UInt16,
    n4 UInt16,
    n5 UInt8,
    n6 UInt8,
    n7 UInt8,
    n8 UInt8
)
ENGINE=MergeTree()
ORDER BY n1;
INSERT INTO morton_numbers (*) values(1, 2, 3, 4, 5, 6, 7, 8);

-- Use column names instead of constants as function arguments
SELECT untuple(mortonDecode(8, mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8))) FROM morton_numbers;
1	2	3	4	5	6	7	8

mortonEncode

引入版本:v24.6.0

计算一组无符号整数的 Morton 编码 (ZCurve) 。

该函数有两种运行模式:

  • 简单模式
  • 扩展模式*

简单模式

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

扩展模式

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

掩码中的每个数字用于指定范围扩展倍数:

  • 1 - 不扩展
  • 2 - 扩展 2 倍
  • 3 - 扩展 3 倍 ⋮
  • 最多可扩展 8 倍。

语法

-- 简单模式
mortonEncode(args)

-- 扩展模式
mortonEncode(range_mask, args)

参数

  • args — 最多 8 个无符号整数,或上述类型的列。UInt8/16/32/64
  • range_mask — 在扩展模式下,每个参数对应的掩码。该掩码是一个由 1 - 8 的无符号整数组成的 Tuple。掩码中的每个数字用于配置范围收缩量。Tuple(UInt8/16/32/64)

返回值

返回一个 UInt64 编码。UInt64

示例

简单模式

SELECT mortonEncode(1, 2, 3)
53

扩展模式

-- 当参数的取值范围(或基数)差异悬殊时,范围扩展有助于获得相近的分布
-- 例如:'IP Address'(0...FFFFFFFF)与 'Country code'(0...FF)
-- 注意:Tuple 的大小必须等于其他参数的数量。
SELECT mortonEncode((1,2), 1024, 16)
1572864

单个参数

-- 对于单个参数,Morton 编码始终等于该参数本身
SELECT mortonEncode(1)
1

单参数展开

SELECT mortonEncode(tuple(2), 128)
32768

列的用法

-- 首先创建表并插入一些数据
CREATE TABLE morton_numbers(
    n1 UInt32,
    n2 UInt32,
    n3 UInt16,
    n4 UInt16,
    n5 UInt8,
    n6 UInt8,
    n7 UInt8,
    n8 UInt8
)
ENGINE=MergeTree()
ORDER BY n1;
INSERT INTO morton_numbers (*) values(1, 2, 3, 4, 5, 6, 7, 8);

-- 使用列名而非常量作为函数参数
SELECT mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8) FROM morton_numbers;
2155374165

sqidDecode

引入于:v24.1.0

sqid 还原为数字数组。

语法

sqidDecode(sqid)

参数

  • sqid — 要解码的 sqid。 String

返回值

返回由 sqid 解码得到的数字数组。 Array(UInt64)

示例

使用示例

SELECT sqidDecode('gXHfJ1C6dN');
┌─sqidDecode('gXHfJ1C6dN')─┐
│ [1,2,3,4,5]              │
└──────────────────────────┘

sqidEncode

引入版本:v24.1.0

将数字转换为 sqid,即一种类似于 YouTube ID 的字符串。

语法

sqidEncode(n1[, n2, ...])

别名: sqid

参数

返回值

返回哈希 ID String

示例

使用示例

SELECT sqidEncode(1, 2, 3, 4, 5);
┌─sqidEncode(1, 2, 3, 4, 5)─┐
│ gXHfJ1C6dN                │
└───────────────────────────┘

unbin

Introduced in: v21.8.0

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

对于数值参数,unbin() 返回的结果并不是 bin() 的逆运算结果。如果要将结果转换为数值,可以使用 reverse 和 reinterpretAs<Type> 函数。

支持二进制数字 01。二进制位数不必是 8 的倍数。如果参数字符串中包含二进制数字以外的任何内容, 则结果未定义 (不会抛出异常) 。

语法

unbin(arg)

参数

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

返回值

返回二进制字符串 (BLOB) 。String

示例

基本用法

SELECT UNBIN('001100000011000100110010'), UNBIN('0100110101111001010100110101000101001100')
┌─UNBIN('001100000011000100110010')─┬─UNBIN('0100110101111001010100110101000101001100')─┐
│ 012                               │ MySQL                                             │
└───────────────────────────────────┴───────────────────────────────────────────────────┘

转换为数值

SELECT reinterpretAsUInt64(reverse(unbin('1110'))) AS num
┌─num─┐
│  14 │
└─────┘

unhex

引入版本:v1.1.0

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

如果要将结果转换为数值,可以使用 reversereinterpretAs<Type> 函数。

支持大写和小写字母 A-F。 十六进制数字的位数不必为偶数。 如果是奇数,最后一位会被解释为 00-0F 字节的低半字节。 如果参数字符串中包含十六进制数字之外的其他内容,则会返回某种由具体实现定义的结果 (不会抛出异常) 。 对于数值参数,unhex() 不会执行 hex(N) 的逆操作。

语法

unhex(arg)

参数

返回值

返回二进制字符串 (BLOB) 。String

示例

基本用法

SELECT unhex('303132'), UNHEX('4D7953514C')
┌─unhex('303132')─┬─UNHEX('4D7953514C')─┐
│ 012             │ MySQL               │
└─────────────────┴─────────────────────┘

转换为数字

SELECT reinterpretAsUInt64(reverse(unhex('FFF'))) AS num
┌──num─┐
│ 4095 │
└──────┘
Navigation