【问题标题】:Matching an IP address with an IP range?将 IP 地址与 IP 范围匹配?
【发布时间】:2011-02-11 18:46:54
【问题描述】:

我有一个 MySQL 表设置如下:

+---------------+-------------+------+-----+---------+----------------+
| 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”,我希望返回上面的行。所以我正在尝试一个看起来像这样的查询(但这当然是错误的,因为在下面我将 IP 视为字符串):

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

有什么建议吗?

【问题讨论】:

    标签: php mysql language-agnostic networking ip


    【解决方案1】:

    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')
    

    【讨论】:

    • 谢谢!甚至不知道这些功能的存在!
    • 是的...如果性能是一个问题,您可以首先将地址作为整数存储在数据库中。
    • 是的.. 在删除此表并创建新表的过程中:)
    • 为了方便,请参阅 INET_NTOA() =)
    • 广泛使用这两个功能:) 你基本上简化了我的生活......再次感谢......!
    猜你喜欢
    • 2018-01-04
    • 2012-05-12
    • 2022-07-22
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2020-10-07
    • 2017-11-27
    • 2010-09-10
    相关资源
    最近更新 更多