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

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

All examples on this page work on VillageSQL. Install Now →
ほとんどの MySQL スキーマは、IP アドレスを VARCHAR(45) として保存しています。動作はしますが、領域を無駄にし、形式の検証を何も行わず、数値順ではなく辞書順でソートします。そのため 192.168.1.10 が 192.168.1.9 より前に並びます。VillageSQL の INET 型はこれらすべてを解決し、IPv4 と IPv6 を同じ列で扱います。

MySQL のデフォルト: VARCHAR

素直なアプローチです。
VARCHAR(45) は、与えられた文字列を何でも保存します。検証はなく、'not-an-ip' もエラーなしで挿入されます。ソートは数値順にならず、サブネットとの比較には文字列操作または変換関数が必要です。

標準的な回避策: INT UNSIGNED + INET_ATON

IPv4 の場合、MySQL の INET_ATON() はドット区切りの 10 進数文字列を 4 バイトの整数に変換します。これはコンパクトで、正しくソートされます。
これは IPv4 のみのスキーマではうまく機能します。問題は IPv6 です。INT UNSIGNED は 128 ビットのアドレスを保持できません。IPv6 には VARBINARY(16) と INET6_ATON() / INET6_NTOA() が必要になり、IPv6 対応が必要になった時点でスキーマ変更が発生します。

VillageSQL の場合: INET 型

VillageSQL の vsql_network_address 拡張機能は、IPv4 と IPv6 の両方のアドレスをコンパクトなバイナリ形式で保存するネイティブの INET 型を追加します。どちらのファミリーでも 1 行あたり固定の 19 バイトで、IPv4 の値はその幅までパディングされます。また、入力時に値を検証します。
無効な文字列はステートメントを中止しません。inet_from_string() は Warning 3200 とともに NULL を返すため、行は NULL 値で挿入されます。不正な入力で挿入を失敗させたい場合は、列を NOT NULL として宣言してください。

保存されたアドレスの操作

インデックス作成

保存方法の選択

組み込みの検証を備え、IPv4 と IPv6 の両方を必要とする新しいスキーマには、INET が最もすっきりした選択肢です。VillageSQL に依存しない IPv4 のみのスキーマには、INET_ATON / INET_NTOA を使った INT UNSIGNED が確立されたアプローチです。 保存されたアドレスに対するサブネットクエリについては、MySQL でのサブネットによるクエリを参照してください。

よくある質問

INET は 192.168.1.5/24 のようなネットマスク付きのアドレスを保存できますか?

はい。INET はホストビットを許可します。192.168.1.5/24 は有効です。ホストビットがゼロであること(純粋なネットワークアドレス)を強制したい場合は、代わりに CIDR 型を使ってください。

INET は挿入時にアドレスを検証しますか?

はい。inet_from_string('not-an-ip') は、不正な値を保存するのではなく NULL を返します。NOT NULL 制約のある INET 列に NULL を渡すと、挿入は失敗します。

ORDER BY ip_address は IPv4 と IPv6 の混在をどうソートしますか?

IPv4 アドレスが IPv6 アドレスより前にソートされます。各ファミリーの中では、アドレスは数値順にソートされます。これは PostgreSQL の INET のソート順と一致します。

INET は PostgreSQL の inet 型と同じですか?

機能的には同じです。同じ型(INET、CIDR、MACADDR、MACADDR8)、同じ関数の命名規則、同じ検証ルールです。主な違いは、VillageSQL が比較とサブネットチェックに演算子ではなく関数を提供することです。

トラブルシューティング

関連項目