FixedString(N)
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)例外をスローします。
データを選択する際、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関数は、FixedString(N)の値がヌルバイトのみで埋められていてもNを返しますが、empty関数はこの場合に1を返します。