私はこれらのテーブルの一つが、この構造を有し、(特に都市/国レベルまで)Maxmindのジオロケーション・テーブルを使用しています:スタンドアロンIPとCIDRをどのように一致させることができますか?
私は別のテーブルでの私のサービスの利用者のIPアドレスを格納します。私はlatitude
とlongitude
の列を作成し、これらのIPの該当する緯度と経度を(IPの対応する行にある)ユーザー表内に格納したいとします。
見られるように、MaxMindテーブル内のIPアドレスは、それが直接にIPがCIDRによって与えられたIP範囲内に収まるかどうかをチェックことはできません。つまり、CIDR形式で保存されています。
MySQLの文だけを使用して、通常のIPをCIDR形式に一致させることは可能ですか?
私はこれを試してみましたが、しかし、次を発見した:私はサブネットを取得することができます
- それが可能ですが、私は(私が持っていない)サブネットマスクを必要とします
MaxMindテーブル内のCIDR表記にusers
テーブルにIPアドレスを照合すると、しばらく時間がかかるだろうと
- ゴー各行しかしデータリーダーに全体 MaxMindテーブルを取得しにCIDRを変換します同時に、IPの範囲
- は、
users
テーブルにデータリーダーを開いて、IP範囲に与えられたIPと一致 UPDATE
以前 からCIDRに一致する緯度と経度と
users
に対応するレコード
ご覧のとおり、私の方法は非常に非効率的で、必要以上に多くの時間がかかることがあります。
MySQLの文を使用するだけで、通常のIPとCIDRを一致させることはできますか?そうでない場合は、をサブネットマスクなしで計算してIPに一致させることはできますか?次のようにusers
テーブル内の関連する
列は以下のとおりです。
「単純にMySQL文を使用して通常のIPとCIDRを一致させることはできますか?」いいえ。「サブネットマスクなしでIP範囲を計算してからIPに一致させることはできますか?」いいえ、どのようにしてサブネットマスクのない範囲を知ることができますか? – itsme86
1つの方法は、列を追加することです。結局のところ、CIDRはアドレスのネットワーク部分のビットマスクに過ぎません。したがって、各範囲では、ネットワーク部分だけを持つ列(整数)があります。次に、探しているIPを取って最終的にネットワーク部分を短くしたり短くしたりすることができます。それは<23クエリです。ブルートフォースと醜い。あなただけのMySQLでそれを行うことはできますか?私は驚くだろう。 – Duston
@ itsme86私は、有料のジオロケーションサービスに頼らずに、私が自由に使えるものを使ってIPの緯度と経度を 'users'テーブルに保存する方法を見つけようとしています。 – cybermonkey