私は、MySQLのドキュメントページで詳しく見ていた、と私はあなたのニーズに合ったそこのポストを見つけました:
SELECT '10.0.0.1' AS IP0,
(SUBSTRING_INDEX('10.0.0.1', '.', 1) * 16777216 +
SUBSTRING_INDEX(SUBSTRING_INDEX('10.0.0.1', '.', 2),'.',-1) * 65536 +
SUBSTRING_INDEX(SUBSTRING_INDEX('10.0.0.1', '.', -2),'.',1) * 256 +
SUBSTRING_INDEX('10.0.0.1', '.', -1)
),
'10.0.255.1' AS IP1,
(SUBSTRING_INDEX('10.0.255.1', '.', 1) * 16777216 +
SUBSTRING_INDEX(SUBSTRING_INDEX('10.0.255.1', '.', 2),'.',-1) * 65536 +
SUBSTRING_INDEX(SUBSTRING_INDEX('10.0.255.1', '.', -2),'.',1) * 256 +
SUBSTRING_INDEX('10.0.255.1', '.', -1)
) AS IP2Num1
は、各IPの数値を返します。他に
Ip: | 10.0.0.1 | 10.0.255.1 |
--------------------------------
Num: | 167772161 | 167837441 |
言葉:
SELECT foo
FROM bar.foobar
WHERE (SUBSTRING_INDEX(ipField, '.', 1) * 16777216 +
SUBSTRING_INDEX(SUBSTRING_INDEX(ipField, '.', 2),'.',-1) * 65536 +
SUBSTRING_INDEX(SUBSTRING_INDEX(ipField, '.', -2),'.',1) * 256 +
SUBSTRING_INDEX(ipField, '.', -1)
) BETWEEN 167772161 AND 167837441;
さて、あなたはこの操作を行うことができます:私は次のクエリでテスト
WHERE ipField LIKE '10.0.%.1'
AND (CAST
(REPLACE(SUBSTRING_INDEX(ipField,'.',3),
CONCAT(SUBSTRING_INDEX(ipField ,'.',2),'.')
,'')
AS UNSIGNED) BETWEEN 0 AND 255)
は:
SELECT IF ('10.0.12.1' LIKE '10.0.%.1'
AND (CAST
(REPLACE(SUBSTRING_INDEX('10.0.12.1','.',3),
CONCAT(SUBSTRING_INDEX('10.0.12.1','.',2),'.')
,'')
AS UNSIGNED) BETWEEN 0 AND 255),
TRUE,
FALSE);
そして、それは正直、それはfaffの少しだ、1
返しますが、ではなく、それ?なぜ単純ではない:
WHERE ipField REGEXP '10\\.0\\.[0-9]{1,3}\\.1'
あなたはこの表現を少し微調整することができますが、基本的に、それは、それらのIPアドレスを照会する最も簡単な方法であると私には思えます。
MySQLの文字列関数の詳細については、ほとんど常に苦労しています。the docs here
なぜ値を%で保存しますか? –
255より大きい数値( '350'など)を使用し、phpのワイルドカードで置き換えますか? – hjpotter92
ワイルドカードはどのように使いたいですか? 10.0.1%と0.1%も有効と考えられますか? – Josay