MYSQL REGEXP INET_NTOA IP地址搜索

时间:2013-10-07 13:54:00

标签: mysql regex ip-address

我无法理解为什么从MySQL查询IP地址获得以下结果。我将IP地址存储为INTEGERS。

mysql> SELECT ip AS ip FROM ipaddress;
+-----------+
| ip        |
+-----------+
| 168456058 |
| 168456059 |
| 168456060 |
| 168456061 |
| 168456317 |
| 168456570 |
| 168489683 |
| 168489583 |
| 168489683 |
+-----------+
9 rows in set (0.00 sec)

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

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)时,我得到了我期望的结果:

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)

如果我在查询中使用小数,则没有结果。

mysql> SELECT INET_NTOA(ip) AS ip FROM ipaddress WHERE INET_NTOA(ip) REGEXP '[[:<:]]\.111[[:>:]]';
Empty set (0.00 sec)

如果我将搜索查询更改为.11,则查询中的小数有效。不过这一次,我得到了所有的.111,和.211

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的结果?

2 个答案:

答案 0 :(得分:1)

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

您在单词边界上绑定了您的模式,然后在您要查找的字符串中包含非单词字符。自'。'字符不是单词字符,永远不会有任何字符串由包含'。'的单词边界分隔。

换句话说,因为'。'本身就是一个单词边界,你正在寻找[字边界] [字边界] [字],这是不可能发生的。

只需取出REGEXP中的单词边界:

WHERE INET_NTOA(ip) REGEXP '\.111'

答案 1 :(得分:1)

[[:&gt;:]]用于单词并使用字母数字字符或下划线分隔。点不是字母数字。你正在寻找一个字符串中的单独单词,其中单词没有分开(点是单词的一部分)。 只需使用WHERE INET_NTOA(ip) like "%.111"