首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL INET_NTOA IP地址搜索

MYSQL INET_NTOA IP地址搜索
EN

Stack Overflow用户
提问于 2013-10-07 13:54:00
回答 2查看 783关注 0票数 1

我很难理解为什么从IP地址的MySQL查询中得到以下结果。我把IP地址存储成整数。

代码语言:javascript
复制
mysql> SELECT ip AS ip FROM ipaddress;
+-----------+
| ip        |
+-----------+
| 168456058 |
| 168456059 |
| 168456060 |
| 168456061 |
| 168456317 |
| 168456570 |
| 168489683 |
| 168489583 |
| 168489683 |
+-----------+
9 rows in set (0.00 sec)

以下是将整数转换为IP地址时数据的外观。

代码语言:javascript
复制
mysql> SELECT INET_NTOA(ip) AS ip FROM ipaddress;
+---------------+
| ip            |
+---------------+
| 10.10.111.122 |
| 10.10.111.123 |
| 10.10.111.124 |
| 10.10.111.125 |
| 10.10.112.125 |
| 10.10.113.122 |
| 10.10.242.211 |
| 10.10.242.111 |
| 10.10.242.211 |
+---------------+
9 rows in set (0.00 sec)

当我搜索一个特定的子网(例如111 )时,我得到了我期望的结果:

代码语言:javascript
复制
mysql> SELECT INET_NTOA(ip) AS ip FROM ipaddress WHERE INET_NTOA(ip) REGEXP '[[:<:]]111[[:>:]]';
+---------------+
| ip            |
+---------------+
| 10.10.111.122 |
| 10.10.111.123 |
| 10.10.111.124 |
| 10.10.111.125 |
| 10.10.242.111 |
+---------------+
5 rows in set (0.00 sec)

如果在查询中使用十进制,则不会得到任何结果。

代码语言:javascript
复制
mysql> SELECT INET_NTOA(ip) AS ip FROM ipaddress WHERE INET_NTOA(ip) REGEXP '[[:<:]]\.111[[:>:]]';
Empty set (0.00 sec)

如果我将搜索查询更改为.11,则查询中的十进制可以工作。不过,这一次,我得到了所有的.111、和.211

代码语言:javascript
复制
mysql> SELECT INET_NTOA(ip) AS ip FROM ipaddress WHERE INET_NTOA(ip) REGEXP '[[:<:]]\.11[[:>:]]';
+---------------+
| ip            |
+---------------+
| 10.10.111.122 |
| 10.10.111.123 |
| 10.10.111.124 |
| 10.10.111.125 |
| 10.10.242.211 |
| 10.10.242.111 |
| 10.10.242.211 |
+---------------+
7 rows in set (0.00 sec)

为什么.11搜索工作和.111不工作,当我使用.11进行搜索时,也会得到.211结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-07 14:07:18

你的正则表达式自相矛盾。

你在字词边界上包围你的模式,然后在你要寻找的字符串中包含一个非单词字符。自从“.”字符不是单词字符,永远不会有任何字符串被包含'.‘的字界分隔。

换句话说,自从“.”是一个词的边界,你在寻找词-边界词,这是不可能发生的.

只需去掉REGEXP中的单词边界:

代码语言:javascript
复制
WHERE INET_NTOA(ip) REGEXP '\.111'
票数 1
EN

Stack Overflow用户

发布于 2013-10-07 14:13:03

[:>:]用于单词,并使用字母、数字字符或下划线分隔。点不是字母数字。您正在查找字符串中的分隔单词,其中单词没有分隔(点是单词的一部分)。只需使用WHERE INET_NTOA(ip) like "%.111"

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19226739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档