> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-3a82795f.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> エンコーディング関数に関するドキュメント

# エンコーディング関数

{/*AUTOGENERATED_START*/}

<div id="bech32Decode">
  ## bech32Decode
</div>

導入バージョン: v25.6.0

`bech32` または `bech32m` アルゴリズムで生成された Bech32 アドレス文字列をデコードします。

<Note>
  エンコード関数とは異なり、`bech32Decode` はパディングされた FixedString を自動的に処理します。
</Note>

**構文**

```sql theme={null}
bech32Decode(address[, 'raw'])
```

**引数**

* `address` — デコードする Bech32 文字列。[`String`](/ja/reference/data-types/string) または [`FixedString`](/ja/reference/data-types/fixedstring)
* `mode` — 省略可。先頭バイトを witness version として取り除かずにデコードするには `'raw'` を指定します。非 SegWit アドレス (例: Cosmos SDK) の場合に使用します。[`String`](/ja/reference/data-types/string)

**戻り値**

文字列のエンコードに使用された `(hrp, data)` で構成されるタプルを返します。データはバイナリ形式です。[`Tuple(String, String)`](/ja/reference/data-types/tuple)

**例**

**アドレスをデコード**

```sql title=Query theme={null}
SELECT tup.1 AS hrp, hex(tup.2) AS data FROM (SELECT bech32Decode('bc1w508d6qejxtdg4y5r3zarvary0c5xw7kj7gz7z') AS tup)
```

```response title=Response theme={null}
bc   751E76E8199196D454941C45D1B3A323F1433BD6
```

**テストネットアドレス**

```sql title=Query theme={null}
SELECT tup.1 AS hrp, hex(tup.2) AS data FROM (SELECT bech32Decode('tb1w508d6qejxtdg4y5r3zarvary0c5xw7kzp034v') AS tup)
```

```response title=Response theme={null}
tb   751E76E8199196D454941C45D1B3A323F1433BD6
```

<div id="bech32Encode">
  ## bech32Encode
</div>

導入バージョン: v25.6.0

[Bech32 または Bech32m](https://en.bitcoin.it/wiki/Bech32) アルゴリズムを使用して、human-readable part (HRP) とバイナリデータ文字列をエンコードします。

<Note>
  [`FixedString`](/ja/reference/data-types/fixedstring) データ型を使用する場合、値が行を完全に埋めないと、null 文字で埋められます。
  `bech32Encode` 関数は hrp 引数についてはこれを自動的に処理しますが、data 引数については値が埋められていてはなりません。
  このため、すべての値の長さが同じであり、かつ `FixedString` カラムもその長さに設定されていることを確実に保証できる場合を除き、
  データ値に [`FixedString`](/ja/reference/data-types/fixedstring) データ型を使用することは推奨されません。
</Note>

**構文**

```sql theme={null}
bech32Encode(hrp, data[, witver | 'bech32' | 'bech32m'])
```

**引数**

* `hrp` — コードの "human-readable part" を指定する、`1 - 83` 文字の小文字からなる String。通常は 'bc' または 'tb' です。[`String`](/ja/reference/data-types/string) または [`FixedString`](/ja/reference/data-types/fixedstring)
* `data` — エンコードするバイナリデータの String。[`String`](/ja/reference/data-types/string) または [`FixedString`](/ja/reference/data-types/fixedstring)
* `witver_or_variant` — 任意。UInt\* の witness version (デフォルトは 1、Bech32 では `0`、Bech32m では `1` 以上) または、String のエンコード variant (`'bech32'` (BIP173) または `'bech32m'` (BIP350) ) のいずれかを指定します。文字列の variant を使用する場合、witness version バイトは先頭に追加されません。これは Cosmos SDK などの非 SegWit アドレスで必要になります。[`UInt*`](/ja/reference/data-types/int-uint) または [`String`](/ja/reference/data-types/string)

**戻り値**

human-readable part、常に '1' である区切り文字、および data part で構成される Bech32 アドレス文字列を返します。文字列の長さが 90 文字を超えることはありません。アルゴリズムが入力から有効なアドレスを生成できない場合は、空文字列を返します。[`String`](/ja/reference/data-types/string)

**例**

**デフォルトの Bech32m**

```sql title=Query theme={null}
-- witness versionが指定されない場合、デフォルトは1（更新されたBech32mアルゴリズム）が使用されます。
SELECT bech32Encode('bc', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'))
```

```response title=Response theme={null}
bc1w508d6qejxtdg4y5r3zarvary0c5xw7k8zcwmq
```

**Bech32アルゴリズム**

```sql title=Query theme={null}
-- witness versionが0の場合、異なるアドレス文字列が生成されます。
SELECT bech32Encode('bc', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'), 0)
```

```response title=Response theme={null}
bc1w508d6qejxtdg4y5r3zarvary0c5xw7kj7gz7z
```

**カスタムHRP**

```sql title=Query theme={null}
-- 'bc'（メインネット）と 'tb'（テストネット）は SegWit アドレス形式で許可される唯一の hrp 値だが、
-- Bech32 は上記の要件を満たす任意の hrp を使用できる。
SELECT bech32Encode('abcdefg', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'), 10)
```

```response title=Response theme={null}
abcdefg1w508d6qejxtdg4y5r3zarvary0c5xw7k9rp8r4
```

**Cosmos SDK アドレス (BIP173、witness versionなし) **

```sql title=Query theme={null}
-- 'bech32' バリアントを使用すると、witness version バイトなしで生データをエンコードします。
-- Cosmos SDK、Injective、Osmosis、その他の非SegWit チェーンと互換性があります。
SELECT bech32Encode('inj', unhex('751e76e8199196d454941c45d1b3a323f1433bd6'), 'bech32')
```

```response title=Response theme={null}
inj1w508d6qejxtdg4y5r3zarvary0c5xw7kgj5aqs
```

<div id="bin">
  ## bin
</div>

導入バージョン: v21.8.0

異なる型に対して、以下のロジックに従った引数の 2 進表現を含む文字列を返します。

| 型                          | 説明                                                                                                                            |
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `(U)Int*`                  | 最上位ビットから最下位ビットに向かって bin の各桁を出力します (ビッグエンディアン、つまり「人が読みやすい」順序) 。最上位の非ゼロバイトから開始し (先頭のゼロバイトは省略されます) 、先頭の桁がゼロでも各バイトは常に 8 桁で出力されます。 |
| `Date` and `DateTime`      | 対応する整数としてフォーマットされます (`Date` は epoch からの日数、`DateTime` は Unix timestamp の値) 。                                                   |
| `String` and `FixedString` | すべてのバイトはそのまま 8 桁の 2 進数としてエンコードされます。ゼロバイトは省略されません。                                                                             |
| `Float*` and `Decimal`     | メモリ上の表現としてエンコードされます。リトルエンディアン アーキテクチャをサポートしているため、リトルエンディアン でエンコードされます。先頭および末尾のゼロバイトは省略されません。                                  |
| `UUID`                     | ビッグエンディアン 順の文字列としてエンコードされます。                                                                                                  |

**構文**

```sql theme={null}
bin(arg)
```

**引数**

* `arg` — バイナリに変換する値。[`String`](/ja/reference/data-types/string) または [`FixedString`](/ja/reference/data-types/fixedstring) または [`(U)Int*`](/ja/reference/data-types/int-uint) または [`Float*`](/ja/reference/data-types/float) または [`Decimal`](/ja/reference/data-types/decimal) または [`Date`](/ja/reference/data-types/date) または [`DateTime`](/ja/reference/data-types/datetime)

**戻り値**

引数のバイナリ表現を表す文字列を返します。[`String`](/ja/reference/data-types/string)

**例**

**単純な整数**

```sql title=Query theme={null}
SELECT bin(14)
```

```response title=Response theme={null}
┌─bin(14)──┐
│ 00001110 │
└──────────┘
```

**Float32数**

```sql title=Query theme={null}
SELECT bin(toFloat32(number)) AS bin_presentation FROM numbers(15, 2)
```

```response title=Response theme={null}
┌─bin_presentation─────────────────┐
│ 00000000000000000111000001000001 │
│ 00000000000000001000000001000001 │
└──────────────────────────────────┘
```

**Float64型の数値**

```sql title=Query theme={null}
SELECT bin(toFloat64(number)) AS bin_presentation FROM numbers(15, 2)
```

```response title=Response theme={null}
┌─bin_presentation─────────────────────────────────────────────────┐
│ 0000000000000000000000000000000000000000000000000010111001000000 │
│ 0000000000000000000000000000000000000000000000000011000001000000 │
└──────────────────────────────────────────────────────────────────┘
```

**UUIDの変換**

```sql title=Query theme={null}
SELECT bin(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0')) AS bin_uuid
```

```response title=Response theme={null}
┌─bin_uuid─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 01100001111100001100010000000100010111001011001100010001111001111001000001111011101001100000000001101010110100111101101110100000 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
```

<div id="bitPositionsToArray">
  ## bitPositionsToArray
</div>

導入バージョン: v21.7.0

この関数は、符号なし整数のバイナリ表現において、1 であるビットの位置を昇順で返します。
符号付きの入力整数は、まず符号なし整数にキャストされます。

**構文**

```sql theme={null}
bitPositionsToArray(arg)
```

**引数**

* `arg` — 整数値。[`(U)Int*`](/ja/reference/data-types/int-uint)

**戻り値**

入力のバイナリ表現において、1 になっているビットの位置を昇順に並べた配列を返します。[`Array(UInt64)`](/ja/reference/data-types/array)

**例**

**1 ビットのみが立っている場合**

```sql title=Query theme={null}
SELECT bitPositionsToArray(toInt8(1)) AS bit_positions
```

```response title=Response theme={null}
┌─bit_positions─┐
│ [0]           │
└───────────────┘
```

**すべてのビットが立っている**

```sql title=Query theme={null}
SELECT bitPositionsToArray(toInt8(-1)) AS bit_positions
```

```response title=Response theme={null}
┌─bit_positions─────────────┐
│ [0, 1, 2, 3, 4, 5, 6, 7]  │
└───────────────────────────┘
```

<div id="bitmaskToArray">
  ## bitmaskToArray
</div>

導入バージョン: v1.1.0

この関数は、整数を 2 の累乗の和に分解します。
2 の累乗は、昇順に並んだ配列として返されます。

**構文**

```sql theme={null}
bitmaskToArray(num)
```

**引数**

* `num` — 整数値。[`(U)Int*`](/ja/reference/data-types/int-uint)

**戻り値**

入力された数の合計となる、2 の累乗を昇順に並べた配列を返します。[`Array(UInt64)`](/ja/reference/data-types/array)

**例**

**基本例**

```sql title=Query theme={null}
SELECT bitmaskToArray(50) AS powers_of_two
```

```response title=Response theme={null}
┌─powers_of_two───┐
│ [2, 16, 32]     │
└─────────────────┘
```

**2の累乗が1つだけ**

```sql title=Query theme={null}
SELECT bitmaskToArray(8) AS powers_of_two
```

```response title=Response theme={null}
┌─powers_of_two─┐
│ [8]           │
└───────────────┘
```

<div id="bitmaskToList">
  ## bitmaskToList
</div>

導入バージョン: v1.1.0

bitmaskToArray と同様に、2 の累乗をカンマ区切りの文字列として返します。

**構文**

```sql theme={null}
bitmaskToList(num)
```

**引数**

* `num` — 整数値。[`(U)Int*`](/ja/reference/data-types/int-uint)

**戻り値**

カンマ区切りの 2 の累乗を含む文字列を返します。[`String`](/ja/reference/data-types/string)

**例**

**基本例**

```sql title=Query theme={null}
SELECT bitmaskToList(50) AS powers_list
```

```response title=Response theme={null}
┌─powers_list───┐
│ 2, 16, 32     │
└───────────────┘
```

<div id="char">
  ## char
</div>

導入バージョン: v20.1.0

渡された引数の数と同じ長さの文字列を返します。各バイトは
対応する引数の値になります。数値型の引数を複数受け付けます。

引数の値が `UInt8` データ型の範囲外である場合、その値は
丸めやオーバーフローが発生する可能性のある形で `UInt8` に変換されます。

**構文**

```sql theme={null}
char(num1[, num2[, ...]])
```

**引数**

* `num1[, num2[, num3 ...]]` — 整数として解釈される数値引数。[`(U)Int8/16/32/64`](/ja/reference/data-types/int-uint) または [`Float*`](/ja/reference/data-types/float)

**戻り値**

指定したバイト列からなる文字列を返します。[`String`](/ja/reference/data-types/string)

**例**

**基本例**

```sql title=Query theme={null}
SELECT char(104.1, 101, 108.9, 108.9, 111) AS hello;
```

```response title=Response theme={null}
┌─hello─┐
│ hello │
└───────┘
```

**任意のエンコーディングの生成**

```sql title=Query theme={null}
-- 対応するバイトを渡すことで、任意のエンコーディングの文字列を構築できます。
-- 例えばUTF-8
SELECT char(0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82) AS hello;
```

```response title=Response theme={null}
┌─hello──┐
│ привет │
└────────┘
```

<div id="hex">
  ## hex
</div>

導入バージョン: v1.1.0

引数の16進表現を含む文字列を返します。型ごとの処理ロジックは次のとおりです。

| Type                       | Description                                                                                                                            |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `(U)Int*`                  | 16進数の桁 (「ニブル」) を、上位桁から下位桁へ (ビッグエンディアン、つまり「human-readable」な順序で) 出力します。最上位の非ゼロバイトから開始し (先頭のゼロバイトは省略されます) 、先頭の桁がゼロであっても各バイトは常に2桁とも出力されます。 |
| `Date` and `DateTime`      | 対応する整数としてフォーマットされます (`Date` は epoch からの日数、`DateTime` は Unix timestamp の値) 。                                                            |
| `String` and `FixedString` | すべてのバイトはそのまま2桁の16進数としてエンコードされます。ゼロバイトも省略されません。                                                                                         |
| `Float*` and `Decimal`     | メモリ上の表現でエンコードされます。ClickHouse は内部的に常にリトルエンディアンで値を表現するため、それに従ってエンコードされます。先頭や末尾のゼロバイトも省略されません。                                            |
| `UUID`                     | ビッグエンディアン順の文字列としてエンコードされます。                                                                                                            |

この関数では大文字の `A-F` を使用し、プレフィックス (`0x` など) や接尾辞 (`h` など) は使用しません。

**構文**

```sql theme={null}
hex(arg)
```

**引数**

* `arg` — 16進数に変換する値。[`String`](/ja/reference/data-types/string) または [`(U)Int*`](/ja/reference/data-types/int-uint) または [`Float*`](/ja/reference/data-types/float) または [`Decimal`](/ja/reference/data-types/decimal) または [`Date`](/ja/reference/data-types/date) または [`DateTime`](/ja/reference/data-types/datetime)

**戻り値**

引数の16進表現を表す文字列を返します。[`String`](/ja/reference/data-types/string)

**例**

**単純な整数値**

```sql title=Query theme={null}
SELECT hex(1)
```

```response title=Response theme={null}
01
```

**Float32型の数値**

```sql title=Query theme={null}
SELECT hex(toFloat32(number)) AS hex_presentation FROM numbers(15, 2)
```

```response title=Response theme={null}
┌─hex_presentation─┐
│ 00007041         │
│ 00008041         │
└──────────────────┘
```

**Float64の数値**

```sql title=Query theme={null}
SELECT hex(toFloat64(number)) AS hex_presentation FROM numbers(15, 2)
```

```response title=Response theme={null}
┌─hex_presentation─┐
│ 0000000000002E40 │
│ 0000000000003040 │
└──────────────────┘
```

**UUIDの変換**

```sql title=Query theme={null}
SELECT lower(hex(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0'))) AS uuid_hex
```

```response title=Response theme={null}
┌─uuid_hex─────────────────────────┐
│ 61f0c4045cb311e7907ba6006ad3dba0 │
└──────────────────────────────────┘
```

<div id="hilbertDecode">
  ## hilbertDecode
</div>

導入バージョン: v24.6.0

ヒルベルト曲線のインデックスをデコードし、多次元空間の座標を表す符号なし整数のタプルに戻します。

`hilbertEncode` 関数と同様に、この関数には 2 つの動作モードがあります。

* **シンプル**
* **拡張**

**シンプルモード**

引数として最大 2 つの符号なし整数を受け取り、`UInt64` コードを生成します。

**拡張モード**

最初の引数として範囲マスク (タプル) を受け取り、そのほかの引数として最大 2 つの符号なし整数を
受け取ります。マスク内の各数値は、対応する引数を左にシフトするビット数を指定し、
その範囲内で引数を実質的にスケーリングします。

範囲の拡張は、範囲 (またはカーディナリティ) が大きく異なる引数に対して、
似た分布が必要な場合に役立ちます。たとえば、'IP Address' `(0...FFFFFFFF)`
と 'Country code' `(0...FF)` のような場合です。encode 関数と同様に、指定できる
数値は最大 8 個までです。

**構文**

```sql theme={null}
hilbertDecode(tuple_size, code)
```

**引数**

* `tuple_size` — `2` 以下の整数値。[`UInt8/16/32/64`](/ja/reference/data-types/int-uint) または [`Tuple(UInt8/16/32/64)`](/ja/reference/data-types/tuple)
* `code` — コードを表す `UInt64` 値。[`UInt64`](/ja/reference/data-types/int-uint)

**戻り値**

指定したサイズのタプルを返します。[`Tuple(UInt64)`](/ja/reference/data-types/tuple)

**例**

**シンプルモード**

```sql title=Query theme={null}
SELECT hilbertDecode(2, 31)
```

```response title=Response theme={null}
["3", "4"]
```

**引数が1つの場合**

```sql title=Query theme={null}
-- 引数が1つの場合、Hilbertコードは常にその引数自体（タプルとして）になります。
SELECT hilbertDecode(1, 1)
```

```response title=Response theme={null}
["1"]
```

**拡張モード**

```sql title=Query theme={null}
-- ビットシフトを指定するタプルを持つ単一の引数は、それに応じて右シフトされます。
SELECT hilbertDecode(tuple(2), 32768)
```

```response title=Response theme={null}
["128"]
```

**カラムでの使用**

```sql title=Query theme={null}
-- まずテーブルを作成してデータを挿入する
CREATE TABLE hilbert_numbers(
    n1 UInt32,
    n2 UInt32
)
ENGINE=MergeTree()
ORDER BY n1 SETTINGS index_granularity_bytes = '10Mi';
insert into hilbert_numbers (*) values(1,2);

-- 定数の代わりにカラム名を関数の引数として使用する
SELECT untuple(hilbertDecode(2, hilbertEncode(n1, n2))) FROM hilbert_numbers;
```

```response title=Response theme={null}
1    2
```

<div id="hilbertEncode">
  ## hilbertEncode
</div>

導入バージョン: v24.6.0

符号なし整数のリストに対する Hilbert Curve のコードを計算します。

この関数には、2 つの動作モードがあります。

* **シンプル**
* **拡張**

**シンプルモード**

最大 2 つの符号なし整数を引数として受け取り、UInt64 のコードを生成します。

**拡張モード**

最初の引数として範囲マスク ([Tuple](/ja/reference/data-types/tuple)) を受け取り、
それ以外の引数として最大 2 つの [符号なし整数](/ja/reference/data-types/int-uint)
を受け取ります。

マスク内の各数値は、対応する
引数を左にシフトするビット数を設定し、その結果、引数はその範囲内で実質的にスケーリングされます。

**構文**

```sql theme={null}
-- シンプルモード
hilbertEncode(args)

-- 拡張モード
hilbertEncode(range_mask, args)
```

**引数**

* `args` — 最大2つの `UInt` 型の値、または `UInt` 型のカラム。[`UInt8/16/32/64`](/ja/reference/data-types/int-uint)
* `range_mask` — 拡張モードでは、最大2つの `UInt` 型の値、または `UInt` 型のカラム。[`UInt8/16/32/64`](/ja/reference/data-types/int-uint)

**戻り値**

`UInt64` 型のコードを返します。[`UInt64`](/ja/reference/data-types/int-uint)

**例**

**シンプルモード**

```sql title=Query theme={null}
SELECT hilbertEncode(3, 4)
```

```response title=Response theme={null}
31
```

**拡張モード**

```sql title=Query theme={null}
-- 範囲の拡張は、範囲（またはカーディナリティ）が大きく異なる引数に対して
-- 同様の分布が必要な場合に有効です。
-- 例: 'IP Address' (0...FFFFFFFF) と 'Country code' (0...FF)。
-- 注意: タプルのサイズは他の引数の数と等しくなければなりません。
SELECT hilbertEncode((10, 6), 1024, 16)
```

```response title=Response theme={null}
4031541586602
```

**引数が1つの場合**

```sql title=Query theme={null}
-- タプルなしの単一引数の場合、次元マッピングが不要なため、関数は引数自体を
-- Hilbert 索引としてそのまま返します。
SELECT hilbertEncode(1)
```

```response title=Response theme={null}
1
```

**拡張 (単一引数) **

```sql title=Query theme={null}
-- 単一の引数がビットシフトを指定するタプルとともに渡された場合、関数は
-- 指定されたビット数だけ引数を左にシフトします。
SELECT hilbertEncode(tuple(2), 128)
```

```response title=Response theme={null}
512
```

**カラムでの使用**

```sql title=Query theme={null}
-- まずテーブルを作成してデータを挿入する
CREATE TABLE hilbert_numbers(
    n1 UInt32,
    n2 UInt32
)
ENGINE=MergeTree()
ORDER BY n1;
insert into hilbert_numbers (*) values(1, 2);

-- 関数の引数として定数の代わりにカラム名を使用する
SELECT hilbertEncode(n1, n2) FROM hilbert_numbers;
```

```response title=Response theme={null}
13
```

<div id="mortonDecode">
  ## mortonDecode
</div>

導入バージョン: v24.6.0

Morton エンコーディング (ZCurve) を、対応する符号なし整数のタプルにデコードします。

`mortonEncode` 関数と同様に、この関数には 2 つの動作モードがあります。

* **シンプル**
* **拡張**

**シンプルモード**

第 1 引数に結果のタプルサイズを、第 2 引数にコードを受け取ります。

**拡張モード**

第 1 引数に範囲マスク (タプル) を、第 2 引数にコードを受け取ります。
マスク内の各数値は、範囲の縮小率を指定します。

* `1` - 縮小なし
* `2` - 2 倍に縮小
* `3` - 3 倍に縮小
  ⋮
* 最大 8 倍まで縮小。

範囲の拡張は、範囲 (またはカーディナリティ) が大きく異なる
引数どうしで似た分布を得たい場合に有効です。たとえば、'IP Address' `(0...FFFFFFFF)`
と 'Country code' `(0...FF)` のような場合です。encode 関数と同様に、指定できる数値は
最大 8 個までに制限されています。

**構文**

```sql theme={null}
-- シンプルモード
mortonDecode(tuple_size, code)

-- 拡張モード
mortonDecode(range_mask, code)
```

**引数**

* `tuple_size` — 8 以下の整数値。[`UInt8/16/32/64`](/ja/reference/data-types/int-uint)
* `range_mask` — 拡張モードでは、各引数に対するマスクです。マスクは符号なし整数のタプルです。マスク内の各数値は、範囲の縮小量を設定します。[`Tuple(UInt8/16/32/64)`](/ja/reference/data-types/tuple)
* `code` — UInt64 のコード。[`UInt64`](/ja/reference/data-types/int-uint)

**戻り値**

指定したサイズのタプルを返します。[`Tuple(UInt64)`](/ja/reference/data-types/tuple)

**例**

**シンプルモード**

```sql title=Query theme={null}
SELECT mortonDecode(3, 53)
```

```response title=Response theme={null}
["1", "2", "3"]
```

**引数が1つの場合**

```sql title=Query theme={null}
SELECT mortonDecode(1, 1)
```

```response title=Response theme={null}
["1"]
```

**拡張モードで 1 つの引数を縮小する**

```sql title=Query theme={null}
SELECT mortonDecode(tuple(2), 32768)
```

```response title=Response theme={null}
["128"]
```

**カラムでの使用**

```sql title=Query theme={null}
-- まずテーブルを作成してデータを挿入する
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;
INSERT INTO morton_numbers (*) values(1, 2, 3, 4, 5, 6, 7, 8);

-- 関数の引数として定数の代わりにカラム名を使用する
SELECT untuple(mortonDecode(8, mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8))) FROM morton_numbers;
```

```response title=Response theme={null}
1 2 3 4 5 6 7 8
```

<div id="mortonEncode">
  ## mortonEncode
</div>

導入バージョン: v24.6.0

符号なし整数のリストの Morton 符号化 (ZCurve) を計算します。

この関数には 2 つの動作モードがあります。

* **シンプル**
* *拡張*\*

**シンプルモード**

最大 8 個の符号なし整数を引数として受け取り、`UInt64` のコードを生成します。

**拡張モード**

最初の引数として範囲マスク ([Tuple](/ja/reference/data-types/tuple)) を受け取り、
そのほかの引数として最大 8 個の [符号なし整数](/ja/reference/data-types/int-uint) を受け取ります。

マスク内の各数値は、範囲をどの程度拡張するかを指定します。

* 1 - 拡張なし
* 2 - 2 倍に拡張
* 3 - 3 倍に拡張
  ⋮
* 最大 8 倍まで拡張。

**構文**

```sql theme={null}
-- シンプルモード
mortonEncode(args)

-- 拡張モード
mortonEncode(range_mask, args)
```

**引数**

* `args` — 前述の型の符号なし整数、またはその型のカラムを最大 8 個まで指定できます。 [`UInt8/16/32/64`](/ja/reference/data-types/int-uint)
* `range_mask` — 拡張モードで使用する、各引数に対応するマスクです。マスクは `1` - `8` の符号なし整数からなるタプルです。マスク内の各数値は、範囲の縮小量を設定します。 [`Tuple(UInt8/16/32/64)`](/ja/reference/data-types/tuple)

**戻り値**

`UInt64` のコードを返します。 [`UInt64`](/ja/reference/data-types/int-uint)

**例**

**シンプルモード**

```sql title=Query theme={null}
SELECT mortonEncode(1, 2, 3)
```

```response title=Response theme={null}
53
```

**拡張モード**

```sql title=Query theme={null}
-- 範囲の拡張は、範囲（またはカーディナリティ）が大きく異なる引数に対して
-- 同様の分布が必要な場合に有効です
-- 例: 'IP Address' (0...FFFFFFFF) と 'Country code' (0...FF)
-- 注意: Tuple のサイズは他の引数の数と等しくなければなりません
SELECT mortonEncode((1,2), 1024, 16)
```

```response title=Response theme={null}
1572864
```

**引数が1つの場合**

```sql title=Query theme={null}
-- 引数が1つの場合、Mortonエンコーディングの結果は常に引数そのものになる
SELECT mortonEncode(1)
```

```response title=Response theme={null}
1
```

**拡張時の単一引数**

```sql title=Query theme={null}
SELECT mortonEncode(tuple(2), 128)
```

```response title=Response theme={null}
32768
```

**カラムでの使用**

```sql title=Query theme={null}
-- まずテーブルを作成し、データを挿入する
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;
INSERT INTO morton_numbers (*) values(1, 2, 3, 4, 5, 6, 7, 8);

-- 関数の引数として定数の代わりにカラム名を使用する
SELECT mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8) FROM morton_numbers;
```

```response title=Response theme={null}
2155374165
```

<div id="sqidDecode">
  ## sqidDecode
</div>

導入バージョン: v24.1.0

[sqid](https://sqids.org/) を数値の配列にデコードします。

**構文**

```sql theme={null}
sqidDecode(sqid)
```

**引数**

* `sqid` — デコードする `sqid`。[`String`](/ja/reference/data-types/string)

**戻り値**

`sqid` から数値の配列を返します。[`Array(UInt64)`](/ja/reference/data-types/array)

**例**

**使用例**

```sql title=Query theme={null}
SELECT sqidDecode('gXHfJ1C6dN');
```

```response title=Response theme={null}
┌─sqidDecode('gXHfJ1C6dN')─────┐
│ [1, 2, 3, 4, 5]              │
└──────────────────────────────┘
```

<div id="sqidEncode">
  ## sqidEncode
</div>

導入バージョン: v24.1.0

数値を、YouTube のような ID 文字列である [sqid](https://sqids.org/) に変換します。

**構文**

```sql theme={null}
sqidEncode(n1[, n2, ...])
```

**別名**: `sqid`

**引数**

* `n1[, n2, ...]` — 任意の個数の数値。[`UInt8/16/32/64`](/ja/reference/data-types/int-uint)

**戻り値**

ハッシュ ID の [`String`](/ja/reference/data-types/string) を返します

**例**

**使用例**

```sql title=Query theme={null}
SELECT sqidEncode(1, 2, 3, 4, 5);
```

```response title=Response theme={null}
┌─sqidEncode(1, 2, 3, 4, 5)─┐
│ gXHfJ1C6dN                │
└───────────────────────────┘
```

<div id="unbin">
  ## unbin
</div>

導入バージョン: v21.8.0

(引数内の) 2 進数の各桁の組を数値として解釈し、その数値が表すバイトに変換します。この関数は `bin` とは逆の操作を行います。

数値引数に対しては、`unbin()` は `bin()` の逆変換を返しません。結果を数値に変換したい場合は、`reverse` 関数と `reinterpretAs<Type>` 関数を使用できます。

<Note>
  `clickhouse-client` 内から `unbin` を呼び出した場合、バイナリ文字列は UTF-8 として表示されます。
</Note>

`0` と `1` の 2 進数のみをサポートします。2 進数の桁数は 8 の倍数である必要はありません。引数文字列に 2 進数以外の文字が含まれている場合、
結果は未定義です (例外はスローされません) 。

**構文**

```sql theme={null}
unbin(arg)
```

**引数**

* `arg` — 0 と 1 からなる任意の長さの文字列。[`String`](/ja/reference/data-types/string)

**戻り値**

バイナリ文字列 (BLOB) を返します。[`String`](/ja/reference/data-types/string)

**例**

**基本的な使い方**

```sql title=Query theme={null}
SELECT UNBIN('001100000011000100110010'), UNBIN('0100110101111001010100110101000101001100')
```

```response title=Response theme={null}
┌─unbin('001100000011000100110010')─┬─unbin('0100110101111001010100110101000101001100')─┐
│ 012                               │ MySQL                                             │
└───────────────────────────────────┴───────────────────────────────────────────────────┘
```

**数値に変換**

```sql title=Query theme={null}
SELECT reinterpretAsUInt64(reverse(unbin('1110'))) AS num
```

```response title=Response theme={null}
┌─num─┐
│  14 │
└─────┘
```

<div id="unhex">
  ## unhex
</div>

導入バージョン: v1.1.0

[`hex`](#hex) とは逆の操作を行います。引数内の 16 進数の各 2 桁を 1 つの数値として解釈し、
その数値が表すバイトに変換します。戻り値はバイナリ文字列 (BLOB) です。

結果を数値に変換したい場合は、`reverse` 関数と `reinterpretAs<Type>` 関数を使用できます。

<Note>
  `clickhouse-client` は文字列を UTF-8 として解釈します。
  そのため、`hex` が返す値が想定外の形で表示されることがあります。
</Note>

大文字と小文字の `A-F` の両方をサポートしています。
16 進数の桁数は偶数である必要はありません。
奇数の場合、最後の 1 桁は `00-0F` バイトの下位 4 ビットとして解釈されます。
引数の文字列に 16 進数以外の文字が含まれている場合、実装依存の結果が返されます (例外はスローされません) 。
数値引数に対しては、hex(N) の逆変換は unhex() では行われません。

**構文**

```sql theme={null}
unhex(arg)
```

**引数**

* `arg` — 任意個の16進数字を含む文字列。[`String`](/ja/reference/data-types/string) または [`FixedString`](/ja/reference/data-types/fixedstring)

**戻り値**

バイナリ文字列 (BLOB) を返します。[`String`](/ja/reference/data-types/string)

**例**

**基本的な使い方**

```sql title=Query theme={null}
SELECT unhex('303132'), UNHEX('4D7953514C')
```

```response title=Response theme={null}
┌─unhex('303132')─┬─unhex('4D7953514C')─┐
│ 012             │ MySQL               │
└─────────────────┴─────────────────────┘
```

**数値へ変換**

```sql title=Query theme={null}
SELECT reinterpretAsUInt64(reverse(unhex('FFF'))) AS num
```

```response title=Response theme={null}
┌──num─┐
│ 4095 │
└──────┘
```
