FixedString(N)
一个长度为 N
字节的固定长度字符串(既不是字符也不是代码点)。
要声明 FixedString
类型的列,请使用以下语法
<column_name> FixedString(N)
其中 N
是一个自然数。
当数据长度正好为 N
字节时,FixedString
类型效率很高。在所有其他情况下,它可能会降低效率。
可以有效存储在 FixedString
类型列中的值的示例
- IP 地址的二进制表示形式(IPv6 为
FixedString(16)
)。 - 语言代码 (ru_RU, en_US ... )。
- 货币代码 (USD, RUB ... )。
- 哈希值的二进制表示形式(MD5 为
FixedString(16)
,SHA256 为FixedString(32)
)。
要存储 UUID 值,请使用 UUID 数据类型。
插入数据时,ClickHouse
- 如果字符串包含少于
N
个字节,则用空字节补充字符串。 - 如果字符串包含超过
N
个字节,则抛出FixedString(N) 值过大
异常。
选择数据时,ClickHouse 不会删除字符串末尾的空字节。如果使用 WHERE
子句,则应手动添加空字节以匹配 FixedString
值。以下示例说明了如何使用带有 FixedString
的 WHERE
子句。
让我们考虑以下包含单个 FixedString(2)
列的表
┌─name──┐
│ b │
└───────┘
查询 SELECT * FROM FixedStringTable WHERE a = 'b'
不会返回任何数据。我们应该用空字节补充过滤器模式。
SELECT * FROM FixedStringTable
WHERE a = 'b\0'
┌─a─┐
│ b │
└───┘
此行为与 MySQL 的 CHAR
类型不同(其中字符串用空格填充,并且输出时会删除空格)。
请注意,FixedString(N)
值的长度是恒定的。length 函数返回 N
,即使 FixedString(N)
值仅用空字节填充,但 empty 函数在这种情况下返回 1
。