VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
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 の両方を扱います。
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 のほうが扱いやすいです。
トラブルシューティング
関連項目
- MySQL での IP アドレスの保存 — INET による IPv4/IPv6 の全体像
- MySQL でのサブネットによる問い合わせ — INET 型を使ったサブネット範囲のクエリ
- MySQL での MAC アドレスの保存 — 同じ拡張機能の MACADDR 型