【问题标题】:mysql where inet_aton like %...%mysql where inet_aton like %...%
【发布时间】:2017-05-10 19:08:43
【问题描述】:

在我的数据库中,我使用 INET_ATON 存储 IP (ipv4)

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

然后,要搜索“正常 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

这可能吗?

【问题讨论】:

    标签: mysql search ip where


    【解决方案1】:

    你可以使用反向函数 INET_NTOA

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

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

    【讨论】:

      【解决方案2】:

      您可以使用这样的查询:

      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>
      

      【讨论】:

      • 这假设 OP 希望搜索一个范围,而不是另一个模式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多