跳到主要内容
跳到主要内容

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 字节,则抛出 Too large value for FixedString(N) 异常。

当选择数据时,ClickHouse 不会删除字符串末尾的空字节。如果您使用 WHERE 子句,则应手动添加空字节以匹配 FixedString 值。以下示例说明了如何将 WHERE 子句与 FixedString 一起使用。

让我们考虑以下具有单个 FixedString(2) 列的表

┌─name──┐
│ b │
└───────┘

查询 SELECT * FROM FixedStringTable WHERE a = 'b' 不会返回任何数据作为结果。我们应该用空字节补充过滤器模式。

SELECT * FROM FixedStringTable
WHERE a = 'b\0'
┌─a─┐
│ b │
└───┘

此行为与 MySQL 的 CHAR 类型不同(在 MySQL 中,字符串用空格填充,并且空格在输出时被删除)。

请注意,FixedString(N) 值的长度是恒定的。即使 FixedString(N) 值仅用空字节填充,length 函数也会返回 N,但 empty 函数在这种情况下返回 1