メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
IPv4 は 4 バイトの整数に収まります。IPv6 は 128 ビットで、16 バイトのバイナリ保存が必要です。MySQL はこのために INET6_ATON() と INET6_NTOA() を提供しており、これらは動作しますが、IPv4 と IPv6 を 1 つの列に混在させるには追加の注意が必要です。VillageSQL の INET 型は、両方のファミリーを一貫した API で 1 つの列に保存します。

MySQL の IPv6 の手法: VARBINARY(16)

MySQL は、バイナリでの IPv6 の保存のために INET6_ATON() と INET6_NTOA() を提供しています。INET6_ATON() は IPv4 と IPv6 の両方を扱います。
両方のファミリーを 1 つの列に保存します。
INET6_NTOA() は IPv4 をドット付き 10 進表記で、IPv6 を圧縮表記で返します。VARBINARY(16) 列は両方を保持します。これが標準的な手法であり、動作します。 摩擦が生じるのは、行がどちらのファミリーを含むかを知る必要がある操作です。
VARBINARY 列からプレフィックス長、ネットマスク、またはネットワークアドレスを取り出す組み込みの手段はありません。

VillageSQL の場合: 統合された INET 型

VillageSQL の vsql_network_address 拡張機能は、IPv4 と IPv6 の両方をネイティブに保存する INET 型を提供します。同じ関数が両方のファミリーで動作し、長さのチェックや別々のコードパスは必要ありません。

IPv6 に特有の操作

IPv6 アドレスは展開表記で保存および取得されます。

アドレスファミリーによるフィルタ

IPv6 における MySQL と VillageSQL の比較

よくある質問

INET 型は IPv4 を IPv4 射影 IPv6 形式(::ffff:x.x.x.x)で保存しますか?

いいえ。IPv4 アドレスは IPv4 射影 IPv6 ではなく、ネイティブの IPv4 として保存されます。inet_family() は、どのように書かれたかにかかわらず、IPv4 アドレスに対して 4 を返します。

INET は ::1 のような IPv6 の圧縮表記を扱えますか?

はい。inet_from_string('::1') と inet_from_string('fe80::1') はどちらも正しく解析されます。圧縮表記は入力で受け入れられ、出力は常に展開形式です。

高速な検索のために INET 列にインデックスを作れますか?

はい。CREATE INDEX idx_ip ON access_log(ip_address) が動作します。等価検索と範囲スキャン(サブネットのクエリ用)はインデックスを使います。パターンについては MySQL でのサブネットによる問い合わせを参照してください。

VARBINARY(16) + INET6_ATON は間違いですか?

いいえ。これは MySQL のみでの正しい手法です。INET よりコンパクトです(固定の 19 バイトに対して 4 または 16 バイト)が、組み込みのファミリー検出、プレフィックスの処理、および検証は失われます。IPv4 と IPv6 の両方にまたがり、プレフィックスを意識した操作が必要なスキーマでは、INET のほうが扱いやすいです。

トラブルシューティング

関連項目