我无法理解为什么从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的结果?
答案 0 :(得分:1)
你的正则表达是自相矛盾的。
您在单词边界上绑定了您的模式,然后在您要查找的字符串中包含非单词字符。自'。'字符不是单词字符,永远不会有任何字符串由包含'。'的单词边界分隔。
换句话说,因为'。'本身就是一个单词边界,你正在寻找[字边界] [字边界] [字],这是不可能发生的。
只需取出REGEXP中的单词边界:
WHERE INET_NTOA(ip) REGEXP '\.111'
答案 1 :(得分:1)
[[:&gt;:]]用于单词并使用字母数字字符或下划线分隔。点不是字母数字。你正在寻找一个字符串中的单独单词,其中单词没有分开(点是单词的一部分)。
只需使用WHERE INET_NTOA(ip) like "%.111"