mysql 其中 inet_aton 喜欢 %...%

mysql where inet_aton like %...%

在我的数据库中,我将 IP (ipv4) 存储为 INET_ATON

<?php
$ip = mysqli_real_escape_string( $con, $_SERVER[ 'REMOTE_ADDR' ] );
mysqli_query( $con, "INSERT INTO table ( ip ) VALUES ( INET_ATON( '$ip' ) )" );

然后,要搜索 "normal ip" 我执行以下操作

SELECT *  FROM table WHERE ip = INET_ATON ('31.165.84.4')

但是怎么只搜索一部分ip呢?例如:

SELECT *  FROM table WHERE ip LIKE INET_ATON ('31.165.84') // not working
SELECT *  FROM table WHERE ip LIKE INET_ATON ('%31.165.84%') // not working

这可能吗?

你可以使用反向功能INET_NTOA

你只有部分匹配('31.165.84')(缺少最后一位)

 SELECT *  FROM table WHERE INET_NTOA(ip) = '31.165.84.4'  

您可以使用这样的查询:

SELECT * 
FROM table 
WHERE ip 
  BETWEEN INET_ATON('31.165.84.0')
  AND INET_ATON('31.165.84.255');

测试

SELECT  
if( INET_ATON('31.165.84.2') -- ip in Table
  BETWEEN INET_ATON('31.165.84.0') -- Min Addr.
  AND INET_ATON('31.165.84.255'),1,0); -- Max Addr.

样本

mysql> SELECT
    -> if( INET_ATON('31.165.84.2')
    ->   BETWEEN INET_ATON('31.165.84.0')
    ->   AND INET_ATON('31.165.84.255'),1,0) as cmp;
+-----+
| cmp |
+-----+
|   1 |
+-----+
1 row in set (0,00 sec)

mysql>
mysql> SELECT
    -> if( INET_ATON('31.165.84.177')
    ->   BETWEEN INET_ATON('31.165.84.0')
    ->   AND INET_ATON('31.165.84.255'),1,0) as cmp;
+-----+
| cmp |
+-----+
|   1 |
+-----+
1 row in set (0,01 sec)

mysql>
mysql> SELECT
    -> if( INET_ATON('31.165.85.177')
    ->   BETWEEN INET_ATON('31.165.84.0')
    ->   AND INET_ATON('31.165.84.255'),1,0) as cmp;
+-----+
| cmp |
+-----+
|   0 |
+-----+
1 row in set (0,00 sec)

mysql>