2010-04-24 184 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