メインコンテンツへスキップ
N バイトの固定長文字列です (文字数でもコードポイント数でもありません) 。 FixedString 型のカラムを宣言するには、次の構文を使用します。
<column_name> FixedString(N)
ここで、N は自然数です。 FixedString 型は、データの長さが厳密に N バイトである場合に効率的です。それ以外の場合は、かえって効率が低下する可能性があります。 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) 例外をスローします。
単一の FixedString(2) カラムを持つ次のテーブルについて考えてみましょう。

INSERT INTO FixedStringTable VALUES ('a'), ('ab'), ('');
SELECT
    name,
    toTypeName(name),
    length(name),
    empty(name)
FROM FixedStringTable;
┌─name─┬─toTypeName(name)─┬─length(name)─┬─empty(name)─┐
│ a    │ FixedString(2)   │            2 │           0 │
│ ab   │ FixedString(2)   │            2 │           0 │
│      │ FixedString(2)   │            2 │           1 │
└──────┴──────────────────┴──────────────┴─────────────┘
FixedString(N) 値の長さは一定であることに注意してください。length 関数は、FixedString(N) の値が null byte のみで埋められている場合でも N を返しますが、この場合 empty 関数は 1 を返します。 WHERE 句でデータを選択すると、条件の指定方法によって結果が異なります。
  • 等価演算子 = または ==、あるいは equals 関数を使用した場合、ClickHouse は \0 文字を 考慮しません。つまり、クエリ SELECT * FROM FixedStringTable WHERE name = 'a';SELECT * FROM FixedStringTable WHERE name = 'a\0'; は同じ結果を返します。
  • LIKE 句を使用した場合、ClickHouse は \0 文字を 考慮します。そのため、フィルタ条件で \0 文字を明示的に指定する必要があることがあります。
SELECT name
FROM FixedStringTable
WHERE name = 'a'
FORMAT JSONStringsEachRow

{"name":"a\u0000"}

SELECT name
FROM FixedStringTable
WHERE name = 'a\0'
FORMAT JSONStringsEachRow

{"name":"a\u0000"}

SELECT name
FROM FixedStringTable
WHERE name = 'a'
FORMAT JSONStringsEachRow

Query id: c32cec28-bb9e-4650-86ce-d74a1694d79e

{"name":"a\u0000"}

SELECT name
FROM FixedStringTable
WHERE name LIKE 'a'
FORMAT JSONStringsEachRow

0 rows in set.

SELECT name
FROM FixedStringTable
WHERE name LIKE 'a\0'
FORMAT JSONStringsEachRow

{"name":"a\u0000"}
最終更新日 2026年6月10日