2009-03-13 4 views
2

というタイトルのテーブルを想定し「取引」MySQLのRegex on IP数値ですか?

典型的なクエリ:私は特定の最初のオクテット(すなわち127)と、すべてのIPのための正規表現検索を行う能力をしたいselect * from transactions where ip=INET_ATON('127.0.0.1');

が、私は非常に把握することはできません構文

ありがとうございます!

+0

これは遅すぎるか、他人のスキーマですが、文字列として保存されたIPアドレスは扱いにくいです。 4つのTINYINTカラムは、操作がはるかに簡単です。ここでは、より詳細な良い記事です:http://sqlserver2000.databases.aspfaq.com/how-should-i-store-an-ip-address-in-sql-server.html – NitroxDM

答えて

0

このようにしますか?

select * from transactions where ip REGEXP "^[1-2][1-9][1-9]" 
+0

これは動作しませんアドレスの数値の最初の3桁は、ドット付き4桁表示と同じではありませんか? –

0
SELECT * FROM transactions WHERE ip LIKE '127.%'; 
1

あなたはIPは32ビット整数であることを意味INET_ATON、結果にIPアドレスを比較しています。あなたの操作は...単純にする必要があります

SELECT * FROM transactions WHERE (longip & 0xFF000000) = (0x7F000000) 

これは、これまでの文字列で点線のIPへの正規表現を適用するよりも速く、そしてLIKE「127%」ソリューションよりも速くなります。

+0

良い答え!あなた(まあ...私)は、IPアドレスが時には単なる数字であることを忘れる傾向があります... – nickf

0

'transactions.ip'はすでに整数であるため、質問者はINT_ATONを使用しています。

SELECT * FROM transactions WHERE INT_NTOA(ip) LIKE '127.%'; 

これは完全なテーブルスキャン(破っインデックス)が必要です。これは、正規表現/のような文字列に対して直接それに一致するようにしようとしない良いません、あなたが戻って最初の逆関数INT_NTOAを使用してIPv4アドレスに変換する必要があります変換して比較する。

私はあなたがIPの前部と比較したい場合には、しかし、特定の最初のオクテットで、すべてのIPのための正規表現検索を行う能力(すなわち127)

をしたいですアドレスは、あなたが最初のオクテットは番号の最上位ビットに格納されているという事実を利用することができ、そして言う。「IP」に関するインデックスを使用して行うことができる

SELECT * FROM transactions WHERE ip BETWEEN INT_NTOA('127.0.0.0') AND INT_NTOA('127.255.255.255'); 

がそうである可能性がかなり多く効率的。

+0

恐ろしいです!ありがとう! –