2010-04-24 240 views
3

我有一個MySQL表設置如下:匹配IP地址與IP範圍?

+---------------+-------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+---------------+-------------+------+-----+---------+----------------+ 
| ipaddress_s | varchar(15) | YES | MUL | NULL |    | 
| ipaddress_e | varchar(16) | YES |  | NULL |    | 
+---------------+-------------+------+-----+---------+----------------+ 

其中,ipaddress_s和ipaddress_e看起來像:4.100.159.0-4.100.159.255

現在是有辦法,我居然能拿到一行包含給定的IP地址?例如,給定IP地址:「4.100.159.5」,我想要返回上面的行。

SELECT * FROM ranges WHERE ipaddress_s<"4.100.159.5" AND ipaddress_e>"4.100.159.5" 

任何建議:所以我想對於一個查詢,看起來是這樣的(因爲在下面我正在考慮IP地址爲字符串,但當然這是錯誤的)?

回答

8

INET_ATON(expr)會將IP地址字符串更改爲可用於比較的數字地址。

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton

SELECT * FROM ranges WHERE INET_ATON(ipaddress_s)<INET_ATON('4.100.159.0') AND INET_ATON(ipaddress_e)>INET_ATON('4.100.159.5') 
+0

謝謝!甚至不知道這些功能存在! – Legend 2010-04-24 03:17:18

+1

是......如果性能是一個問題,你可能首先將地址作爲整數存儲在數據庫中。 – WhirlWind 2010-04-24 03:25:56

+0

是的..在刪除此表並創建一個新的過程:) – Legend 2010-04-24 03:42:49