编码函数
char
返回一个字符串,其长度为传递的参数数量,并且每个字节的值都与相应的参数相同。接受数值类型的多个参数。如果参数值超出 UInt8 数据类型的范围,则会将其转换为 UInt8,并可能进行舍入和溢出。
语法
char(number_1, [number_2, ..., number_n]);
参数
返回值
- 给定字节的字符串。String。
示例
查询
SELECT char(104.1, 101, 108.9, 108.9, 111) AS hello;
结果
┌─hello─┐
│ hello │
└───────┘
您可以通过传递相应的字节来构造任意编码的字符串。 这是 UTF-8 的示例
查询
SELECT char(0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82) AS hello;
结果
┌─hello──┐
│ привет │
└────────┘
查询
SELECT char(0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD) AS hello;
结果
┌─hello─┐
│ 你好 │
└───────┘
hex
返回一个包含参数的十六进制表示形式的字符串。
别名:HEX
。
语法
hex(arg)
该函数使用大写字母 A-F
,并且不使用任何前缀(如 0x
)或后缀(如 h
)。
对于整数参数,它从最高有效位到最低有效位(大端或“人类可读”顺序)打印十六进制数字(“半字节”)。它从最高有效非零字节开始(省略前导零字节),但即使前导数字为零,也始终打印每个字节的两位数字。
类型为 Date 和 DateTime 的值格式化为相应的整数(Date 为自 Epoch 以来的天数,DateTime 为 Unix 时间戳的值)。
对于 String 和 FixedString,所有字节都简单地编码为两个十六进制数字。零字节不会被省略。
类型为 Float 和 Decimal 的值按照它们在内存中的表示形式进行编码。由于我们支持小端架构,因此它们以小端方式编码。零前导/尾随字节不会被省略。
类型为 UUID 的值编码为大端序字符串。
参数
返回值
- 带有参数的十六进制表示形式的字符串。String。
示例
查询
SELECT hex(1);
结果
01
查询
SELECT hex(toFloat32(number)) AS hex_presentation FROM numbers(15, 2);
结果
┌─hex_presentation─┐
│ 00007041 │
│ 00008041 │
└──────────────────┘
查询
SELECT hex(toFloat64(number)) AS hex_presentation FROM numbers(15, 2);
结果
┌─hex_presentation─┐
│ 0000000000002E40 │
│ 0000000000003040 │
└──────────────────┘
查询
SELECT lower(hex(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0'))) as uuid_hex
结果
┌─uuid_hex─────────────────────────┐
│ 61f0c4045cb311e7907ba6006ad3dba0 │
└──────────────────────────────────┘
unhex
执行 hex 的相反操作。它将每对十六进制数字(在参数中)解释为一个数字,并将其转换为该数字表示的字节。返回值是二进制字符串 (BLOB)。
如果您想将结果转换为数字,可以使用 reverse 和 reinterpretAs<Type> 函数。
如果 unhex
是从 clickhouse-client
中调用的,则二进制字符串将使用 UTF-8 显示。
别名:UNHEX
。
语法
unhex(arg)
参数
arg
— 包含任意数量的十六进制数字的字符串。String, FixedString。
支持大写和小写字母 A-F
。十六进制数字的数量不必是偶数。如果是奇数,则最后一个数字被解释为 00-0F
字节的最低有效半字节。如果参数字符串包含十六进制数字以外的任何内容,则返回一些实现定义的结果(不会抛出异常)。对于数值参数,unhex() 不执行 hex(N) 的逆运算。
返回值
- 二进制字符串 (BLOB)。String。
示例
查询
SELECT unhex('303132'), UNHEX('4D7953514C');
结果
┌─unhex('303132')─┬─unhex('4D7953514C')─┐
│ 012 │ MySQL │
└─────────────────┴─────────────────────┘
查询
SELECT reinterpretAsUInt64(reverse(unhex('FFF'))) AS num;
结果
┌──num─┐
│ 4095 │
└──────┘
bin
返回一个包含参数的二进制表示形式的字符串。
语法
bin(arg)
别名:BIN
。
对于整数参数,它从最高有效位到最低有效位(大端或“人类可读”顺序)打印二进制数字。它从最高有效非零字节开始(省略前导零字节),但如果前导数字为零,则始终打印每个字节的八位数字。
类型为 Date 和 DateTime 的值格式化为相应的整数(Date
为自 Epoch 以来的天数,DateTime
为 Unix 时间戳的值)。
对于 String 和 FixedString,所有字节都简单地编码为八个二进制数字。零字节不会被省略。
类型为 Float 和 Decimal 的值按照它们在内存中的表示形式进行编码。由于我们支持小端架构,因此它们以小端方式编码。零前导/尾随字节不会被省略。
类型为 UUID 的值编码为大端序字符串。
参数
返回值
- 带有参数的二进制表示形式的字符串。String。
示例
查询
SELECT bin(14);
结果
┌─bin(14)──┐
│ 00001110 │
└──────────┘
查询
SELECT bin(toFloat32(number)) AS bin_presentation FROM numbers(15, 2);
结果
┌─bin_presentation─────────────────┐
│ 00000000000000000111000001000001 │
│ 00000000000000001000000001000001 │
└──────────────────────────────────┘
查询
SELECT bin(toFloat64(number)) AS bin_presentation FROM numbers(15, 2);
结果
┌─bin_presentation─────────────────────────────────────────────────┐
│ 0000000000000000000000000000000000000000000000000010111001000000 │
│ 0000000000000000000000000000000000000000000000000011000001000000 │
└──────────────────────────────────────────────────────────────────┘
查询
SELECT bin(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0')) as bin_uuid
结果
┌─bin_uuid─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 01100001111100001100010000000100010111001011001100010001111001111001000001111011101001100000000001101010110100111101101110100000 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
unbin
将每对二进制数字(在参数中)解释为一个数字,并将其转换为该数字表示的字节。该函数执行 bin 的相反操作。
语法
unbin(arg)
别名:UNBIN
。
对于数值参数,unbin()
不返回 bin()
的逆运算。如果您想将结果转换为数字,可以使用 reverse 和 reinterpretAs<Type> 函数。
如果 unbin
是从 clickhouse-client
中调用的,则二进制字符串将使用 UTF-8 显示。
支持二进制数字 0
和 1
。二进制数字的数量不必是八的倍数。如果参数字符串包含二进制数字以外的任何内容,则返回一些实现定义的结果(不会抛出异常)。
参数
arg
— 包含任意数量的二进制数字的字符串。String。
返回值
- 二进制字符串 (BLOB)。String。
示例
查询
SELECT UNBIN('001100000011000100110010'), UNBIN('0100110101111001010100110101000101001100');
结果
┌─unbin('001100000011000100110010')─┬─unbin('0100110101111001010100110101000101001100')─┐
│ 012 │ MySQL │
└───────────────────────────────────┴───────────────────────────────────────────────────┘
查询
SELECT reinterpretAsUInt64(reverse(unbin('1110'))) AS num;
结果
┌─num─┐
│ 14 │
└─────┘
bitmaskToList(num)
接受一个整数。返回一个字符串,其中包含当求和时总计为源数字的 2 的幂的列表。它们以逗号分隔,文本格式不带空格,按升序排列。
bitmaskToArray(num)
接受一个整数。返回一个 UInt64 数字数组,其中包含当求和时总计为源数字的 2 的幂的列表。数组中的数字按升序排列。
bitPositionsToArray(num)
接受一个整数并将其转换为无符号整数。返回一个 UInt64
数字数组,其中包含 arg
中等于 1
的位的位位置列表,按升序排列。
语法
bitPositionsToArray(arg)
参数
arg
— 整数值。Int/UInt。
返回值
示例
查询
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] │
└───────────────────┘
mortonEncode
计算无符号整数列表的 Morton 编码 (ZCurve)。
该函数有两种操作模式
- 简单模式
- 扩展模式
简单模式
最多接受 8 个无符号整数作为参数,并生成一个 UInt64 代码。
语法
mortonEncode(args)
参数
args
:最多 8 个 无符号整数 或上述类型的列。
返回值
- UInt64 代码。UInt64
示例
查询
SELECT mortonEncode(1, 2, 3);
结果
53
扩展模式
接受范围掩码(tuple)作为第一个参数,最多接受 8 个 无符号整数 作为其他参数。
掩码中的每个数字都配置范围扩展量
1 - 无扩展
2 - 2 倍扩展
3 - 3 倍扩展
...
最多 8 倍扩展。
语法
mortonEncode(range_mask, args)
参数
range_mask
: 1-8.args
:最多 8 个 无符号整数 或上述类型的列。
注意:当对 args
使用列时,提供的 range_mask
元组仍应为常量。
返回值
- UInt64 代码。UInt64
示例
当您需要范围差异很大的参数(或基数)具有相似的分布时,范围扩展可能很有用。例如:“IP 地址”(0...FFFFFFFF) 和“国家代码”(0...FF)。
查询
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 SETTINGS index_granularity = 8192, index_granularity_bytes = '10Mi';
insert into morton_numbers (*) values(1,2,3,4,5,6,7,8);
使用列名而不是常量作为 mortonEncode
的函数参数
查询
SELECT mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8) FROM morton_numbers;
结果
2155374165
实现细节
请注意,您只能将这么多位的信息放入 Morton 代码中,因为 UInt64 具有。两个参数的最大范围均为 2^32 (64/2),三个参数的最大范围均为 2^21 (64/3),依此类推。所有溢出都将被限制为零。
mortonDecode
将 Morton 编码 (ZCurve) 解码为相应的无符号整数元组。
与 mortonEncode
函数一样,此函数有两种操作模式
- 简单模式
- 扩展模式
简单模式
接受结果元组大小作为第一个参数,代码作为第二个参数。
语法
mortonDecode(tuple_size, code)
参数
tuple_size
:整数值,不超过 8。code
:UInt64 代码。
返回值
示例
查询
SELECT mortonDecode(3, 53);
结果
["1","2","3"]
扩展模式
接受范围掩码(元组)作为第一个参数,代码作为第二个参数。掩码中的每个数字都配置范围缩小量
1 - 无缩小
2 - 2 倍缩小
3 - 3 倍缩小
...
最多 8 倍缩小。
当您需要范围差异很大的参数(或基数)具有相似的分布时,范围扩展可能很有用。例如:“IP 地址”(0...FFFFFFFF) 和“国家代码”(0...FF)。与编码函数一样,这最多限制为 8 个数字。
示例
查询
SELECT mortonDecode(1, 1);
结果
["1"]
示例
也可以缩小一个参数
查询
SELECT mortonDecode(tuple(2), 32768);
结果
["128"]
示例
您也可以在函数中使用列名。
首先创建表并插入一些数据。
查询
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 SETTINGS index_granularity = 8192, index_granularity_bytes = '10Mi';
insert into morton_numbers (*) values(1,2,3,4,5,6,7,8);
使用列名而不是常量作为 mortonDecode
的函数参数
查询
select untuple(mortonDecode(8, mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8))) from morton_numbers;
结果
1 2 3 4 5 6 7 8
hilbertEncode
计算 Hilbert 曲线的代码,用于无符号整数列表。
该函数有两种操作模式
- 简单模式
- 扩展模式
简单模式
简单:最多接受 2 个无符号整数作为参数,并生成一个 UInt64 代码。
语法
hilbertEncode(args)
参数
args
:最多 2 个 无符号整数 或上述类型的列。
返回值
- UInt64 代码
类型:UInt64
示例
查询
SELECT hilbertEncode(3, 4);
结果
31
扩展模式
接受范围掩码(tuple)作为第一个参数,最多接受 2 个 无符号整数 作为其他参数。
掩码中的每个数字都配置相应参数将左移的位数,从而有效地在其范围内缩放参数。
语法
hilbertEncode(range_mask, args)
参数
注意:当对 args
使用列时,提供的 range_mask
元组仍应为常量。
返回值
- UInt64 代码
类型:UInt64
示例
当您需要范围差异很大的参数(或基数)具有相似的分布时,范围扩展可能很有用。例如:“IP 地址”(0...FFFFFFFF) 和“国家代码”(0...FF)。
查询
SELECT hilbertEncode((10,6), 1024, 16);
结果
4031541586602
注意:元组大小必须等于其他参数的数量。
示例
对于没有元组的单个参数,该函数返回参数本身作为 Hilbert 索引,因为不需要维度映射。
查询
SELECT hilbertEncode(1);
结果
1
示例
如果提供了带有指定位移的元组的单个参数,则该函数会将参数左移指定的位数。
查询
SELECT hilbertEncode(tuple(2), 128);
结果
512
示例
该函数还接受列作为参数
查询
首先创建表并插入一些数据。
create table hilbert_numbers(
n1 UInt32,
n2 UInt32
)
Engine=MergeTree()
ORDER BY n1 SETTINGS index_granularity = 8192, index_granularity_bytes = '10Mi';
insert into hilbert_numbers (*) values(1,2);
使用列名而不是常量作为 hilbertEncode
的函数参数
查询
SELECT hilbertEncode(n1, n2) FROM hilbert_numbers;
结果
13
实现细节
请注意,您只能将这么多位的信息放入 Hilbert 代码中,因为 UInt64 具有。两个参数的最大范围均为 2^32 (64/2)。所有溢出都将被限制为零。
hilbertDecode
将 Hilbert 曲线索引解码回无符号整数元组,表示多维空间中的坐标。
与 hilbertEncode
函数一样,此函数有两种操作模式
- 简单模式
- 扩展模式
简单模式
最多接受 2 个无符号整数作为参数,并生成一个 UInt64 代码。
语法
hilbertDecode(tuple_size, code)
参数
tuple_size
:整数值,不超过 2。code
:UInt64 代码。
返回值
- 指定大小的 tuple。
类型:UInt64
示例
查询
SELECT hilbertDecode(2, 31);
结果
["3", "4"]
扩展模式
接受范围掩码(元组)作为第一个参数,最多接受 2 个无符号整数作为其他参数。掩码中的每个数字都配置相应参数将左移的位数,从而有效地在其范围内缩放参数。
当您需要范围差异很大的参数(或基数)具有相似的分布时,范围扩展可能很有用。例如:“IP 地址”(0...FFFFFFFF) 和“国家代码”(0...FF)。与编码函数一样,这最多限制为 8 个数字。
示例
一个参数的 Hilbert 代码始终是参数本身(作为元组)。
查询
SELECT hilbertDecode(1, 1);
结果
["1"]
示例
带有指定位移的元组的单个参数将相应地右移。
查询
SELECT hilbertDecode(tuple(2), 32768);
结果
["128"]
示例
该函数接受代码列作为第二个参数
首先创建表并插入一些数据。
查询
create table hilbert_numbers(
n1 UInt32,
n2 UInt32
)
Engine=MergeTree()
ORDER BY n1 SETTINGS index_granularity = 8192, index_granularity_bytes = '10Mi';
insert into hilbert_numbers (*) values(1,2);
使用列名而不是常量作为 hilbertDecode
的函数参数
查询
select untuple(hilbertDecode(2, hilbertEncode(n1, n2))) from hilbert_numbers;
结果
1 2