【问题标题】:MySQL check if an IP-address is in range?MySQL检查IP地址是否在范围内?
【发布时间】:2014-06-12 08:10:32
【问题描述】:

我有一个包含两列 ipStart 和 ipEnd 的表

这两个字段包含一个IP地址范围。例如:

`ipStart` = 193.235.18.0

和

ipEnd = 193.235.21.255

我希望能够选择 ip 在该范围内的行,例如:

193.235.19.255

这可能吗?

【问题讨论】:

  • 我不会在 SQL 中这样做。做你最喜欢的。哪种编程语言更好。
  • 你尝试过吗?从价格在 10 到 20 之间的产品中选择 *;
  • @cb0 所以你遍历程序中的所有mysql行?
  • @cb0 在应用程序中执行此操作意味着每次都检索整个表。如果桌子很大,那就有问题了。

标签: mysql


【解决方案1】:

试试这个

SELECT *
FROM TABLE_NAME
WHERE (INET_ATON("193.235.19.255") BETWEEN INET_ATON(ipStart) AND INET_ATON(ipEnd));

【讨论】:

  • 在包含超过 6000 万条记录的数据库中,这会有多“重”?
  • 非常重,因为不会使用索引。最好在数据库中将 IP 作为数值,然后在它们上创建索引。
  • 所以我将存储:193.235.18.0 为:193235180 ?
  • 没有。使用 INET_ATON() 函数进行转换。它实际上是 (a*256^3)+(b*256^2)+(c*256)+d。
  • 不错的一个。没听说过这个! :D thumbs_up
【解决方案2】:

解释将 IP 地址转换为一些答案所依赖的数字(我同意)。

ip地址需要被视为一个32位数字而不是4个8位数字

例如ip地址

193.235.18.0

转换成二进制是:-

11000001.11101011.00010010.00000000

你翻译成的(即去掉点):-

11000001111010110001001000000000

计算出你会得到:-

1 * 2147483648 = 2147483648 
1 * 1073741824 = 1073741824 
0 * 536870912 = 0
0 * 268435456 = 0
0 * 134217728 = 0
0 * 67108864 = 0
0 * 33554432 = 0
1 * 16777216 = 16777216 
1 * 8388608 = 8388608 
1 * 4194304 = 4194304 
1 * 2097152 = 2097152 
0 * 1048576 = 0
1 * 524288 = 524288 
0 * 262144 = 0
1 * 131072 = 131072 
1 * 65536 = 65536 
0 * 32768 = 0
0 * 16384 = 0
0 * 8192 = 0
1 * 4096 = 4096 
0 * 2048 = 0
0 * 1024 = 0
1 * 512 = 512 
0 * 256 = 0
0 * 128 = 0
0 * 64 = 0
0 * 32 = 0
0 * 16 = 0
0 * 8 = 0
0 * 4 = 0
0 * 2 = 0
0 * 1 = 0

将它们加在一起得到 3253408256

通过将原始 IP 地址视为基数 256 数字,您是一个捷径。所以你有 0 个单位,256 个中的 18 个,65536 个中的 235 个(即 256 * 256)和 193 个(即 256 * 256 * 256)

0 * 1 + 18 * 256 + 235 * 256 * 256 + 193 * 256 * 256 * 256

上面提到的 INET_ATON 函数会为您执行此操作。

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 2017-05-28
    • 1970-01-01
    • 2017-05-21
    • 2018-08-29
    • 2021-09-08
    • 2014-09-14
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多