> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL 用 vsql_network_address 拡張機能

> vsql_network_address 拡張機能は、包含、ネットマスク、および比較の関数とともに、INET、CIDR、MACADDR、および MACADDR8 カラム型を MySQL に追加します。

`VARCHAR` に保存された IP アドレスはアルファベット順に並び、入力ミスを受け付け、アドレスがネットワーク内に入るかどうかに答えられません。`vsql_network_address` は、入力を検証し、正しく並べ替えられ、それに伴う包含とネットマスクの関数を備えた 4 つのカラム型を追加します。PostgreSQL の `inet`、`cidr`、`macaddr`、および `macaddr8` 型に従っています。

| | |
| - | - |
| **メンテナー** | VillageSQL |
| **ソースと完全なドキュメント** | [villagesql/vsql-network-address](https://github.com/villagesql/vsql-network-address) |
| **ライセンス** | GPL-2.0 |

## インストール

インストールスクリプト、Docker イメージ、またはリリース tarball で VillageSQL をインストールした場合、`vsql_network_address.veb` はすでにサーバーの `lib/veb/` ディレクトリにあります。1 つのステートメントでサーバーにインストールします。

```sql theme={null}
INSTALL EXTENSION vsql_network_address;
```

インストールされたことを確認します。

```sql theme={null}
SELECT EXTENSION_NAME
FROM INFORMATION_SCHEMA.EXTENSIONS
WHERE EXTENSION_NAME = 'vsql_network_address';
```

```
+----------------------+
| EXTENSION_NAME       |
+----------------------+
| vsql_network_address |
+----------------------+
```

自分でビルドするには、[リポジトリ](https://github.com/villagesql/vsql-network-address)のビルド手順に従ってください。

## 追加される機能

### 型

| 型 | 保持する内容 | バイト数 |
| - | - | - |
| `INET` | ネットマスク付き (省略可) のホストアドレス。IPv4 または IPv6 | 19 |
| `CIDR` | ネットワークアドレス | 19 |
| `MACADDR` | 6 バイトのハードウェアアドレス | 6 |
| `MACADDR8` | 8 バイトのハードウェアアドレス | 8 |

```sql theme={null}
CREATE TABLE hosts (
    id    INT PRIMARY KEY,
    label VARCHAR(16),
    addr  INET,
    mac   MACADDR
);
```

### 関数

| 関数 | 戻り値 | 説明 |
| - | - | - |
| `inet_from_string(s)`, `inet_to_string(a)` | `INET`, text | テキストと `INET` を相互に変換する |
| `cidr_from_string(s)`, `cidr_to_string(c)` | `CIDR`, text | `CIDR` についても同様 |
| `macaddr_from_string(s)`, `macaddr_to_string(m)` | `MACADDR`, text | `MACADDR` についても同様 |
| `macaddr8_from_string(s)`, `macaddr8_to_string(m)` | `MACADDR8`, text | `MACADDR8` についても同様 |
| `inet_compare(a, b)`, `cidr_compare(a, b)`, `macaddr_compare(a, b)`, `macaddr8_compare(a, b)` | int | -1、0、または 1 |
| `inet_contains(a, b)` | int | `a` が `b` を真に包含するとき 1 |
| `inet_contains_or_equals(a, b)` | int | `a` が `b` を包含するか、等しいとき 1 |
| `inet_contained_by(a, b)` | int | `a` が `b` の真に内側にあるとき 1 |
| `inet_contained_by_or_equals(a, b)` | int | `a` が `b` の内側にあるか、等しいとき 1 |
| `inet_overlaps(a, b)` | int | どちらかが他方を包含するか、等しいとき 1 |
| `inet_family(a)` | int | 4 または 6 |
| `inet_masklen(a)` | int | ネットマスクの長さ |
| `inet_set_masklen(a, n)`, `cidr_set_masklen(c, n)` | `INET`, `CIDR` | 同じアドレスに異なるネットマスクを付けたもの |
| `inet_host(a)`, `inet_text(a)`, `inet_abbrev(a)`, `cidr_abbrev(c)` | text | マスクなしのアドレス、マスク付きのアドレス、および省略形 |
| `inet_netmask(a)`, `inet_hostmask(a)` | `INET` | ネットマスクとその補数 |
| `inet_broadcast(a)` | `INET` | 所属するネットワークのブロードキャストアドレス |
| `inet_network(a)` | `CIDR` | アドレスが属するネットワーク |
| `macaddr_trunc(m)` | `MACADDR` | 末尾 3 バイトをゼロにして、製造元プレフィックスを残す |

## 例

```sql theme={null}
INSERT INTO hosts VALUES
    (1, 'gateway', '192.168.1.1/24',  '00:1b:63:84:45:e6'),
    (2, 'printer', '192.168.1.50/24', '3c:22:fb:aa:01:02'),
    (3, 'vpn',     '10.8.0.7/16',     '00:1b:63:84:45:e7');

SELECT label, addr, inet_masklen(addr) AS mask, inet_family(addr) AS family
FROM hosts ORDER BY addr;
```

```
+---------+-----------------+------+--------+
| label   | addr            | mask | family |
+---------+-----------------+------+--------+
| vpn     | 10.8.0.7/16     |   16 |      4 |
| gateway | 192.168.1.1/24  |   24 |      4 |
| printer | 192.168.1.50/24 |   24 |      4 |
+---------+-----------------+------+--------+
```

行はアルファベット順ではなく、アドレス順で返ります。テキスト順では `9.0.0.1` は `10.8.0.7` の後に来ますが、アドレス順ではその前に来ます。

どのホストがネットワーク上にあるかを尋ねます。

```sql theme={null}
SELECT label FROM hosts
WHERE inet_contained_by_or_equals(addr, inet_from_string('192.168.1.0/24')) = 1;
```

```
+---------+
| label   |
+---------+
| gateway |
| printer |
+---------+
```

ネットワークとそのブロードキャストアドレスを導出します。

```sql theme={null}
SELECT inet_network(inet_from_string('192.168.1.50/24')) AS network,
       inet_broadcast(inet_from_string('192.168.1.50/24')) AS broadcast;
```

```
+----------------+------------------+
| network        | broadcast        |
+----------------+------------------+
| 192.168.1.0/24 | 192.168.1.255/24 |
+----------------+------------------+
```

> [!NOTE]
>
> `inet_contained_by` は真の包含を判定するため、ネットワークと同じネットマスクを持つアドレスは、そのネットワークに包含されません。`192.168.1.0/24` の中の `192.168.1.5/32` は 1 を返しますが、同じネットワークの中の `192.168.1.5/24` は 0 を返します。上の例のように、保存された行がネットワーク自身のマスクを持つ場合は `inet_contained_by_or_equals` を使用してください。

## 関連項目

* [MySQL での IP アドレスの保存](https://villagesql.com/docs/en/guides/storing-ip-addresses.md) — INET、VARCHAR、および整数の使い分け
* [サブネットクエリ](https://villagesql.com/docs/en/guides/subnet-queries.md) — 包含と重なり、およびそれぞれの意味
* [MAC アドレスの保存](https://villagesql.com/docs/en/guides/storing-mac-addresses.md) — MACADDR と MACADDR8 の比較
* [拡張機能のインストール](https://villagesql.com/docs/ja/extensions/install.md) — `INSTALL EXTENSION` の仕組みと、サーバーがバンドルを探す場所
* [利用可能な拡張機能](https://villagesql.com/docs/ja/extensions/catalog) — 完全なカタログ
* [villagesql/vsql-network-address](https://github.com/villagesql/vsql-network-address) — ソース、ビルド手順、および既知の制限事項


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.