MySQL检查IP地址是否在范围内?

Alo*_*ius 11 mysql

我有一个包含两列的表ipStartipEnd

这两个字段包含一系列ip地址.例如:

`ipStart` = 193.235.18.0
Run Code Online (Sandbox Code Playgroud)

ipEnd = 193.235.21.255
Run Code Online (Sandbox Code Playgroud)

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

193.235.19.255
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Sad*_*san 21

试试这个

SELECT *
FROM TABLE_NAME
WHERE (INET_ATON("193.235.19.255") BETWEEN INET_ATON(ipStart) AND INET_ATON(ipEnd));
Run Code Online (Sandbox Code Playgroud)

  • 不可以.使用INET_ATON()函数进行转换.它实际上是(a*256 ^ 3)+(b*256 ^ 2)+(c*256)+ d. (4认同)
  • 很重,因为不会使用索引.最好将IP作为数据库中的数值,然后在它们上创建索引. (3认同)

Kic*_*art 6

解释将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
Run Code Online (Sandbox Code Playgroud)

将这些添加到一起你得到3253408256

通过将原始IP地址视为基数256,您可以获得一些捷径.所以你有0个单位,18个256个,235个65536个(即256*256个)和193个(即256*256*256个)

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

提到的INET_ATON函数为您执行此操作.