MYSQL REGEXP INET\u NTOA IP地址搜索

MYSQL REGEXP INET\u NTOA IP地址搜索,mysql,regex,ip-address,Mysql,Regex,Ip Address,我很难理解为什么通过MySQL查询IP地址会得到以下结果。我将IP地址存储为整数 mysql> SELECT ip AS ip FROM ipaddress; +-----------+ | ip | +-----------+ | 168456058 | | 168456059 | | 168456060 | | 168456061 | | 168456317 | | 168456570 | | 168489683 | | 168489583 | | 168489683 |

我很难理解为什么通过MySQL查询IP地址会得到以下结果。我将IP地址存储为整数

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地址时数据的外观

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>从ip地址中选择INET_NTOA(ip)作为ip,其中INET_NTOA(ip)REGEXP'[[[::]];
+---------------+
|知识产权|
+---------------+
| 10.10.111.122 |
| 10.10.111.123 |
| 10.10.111.124 |
| 10.10.111.125 |
| 10.10.242.111 |
+---------------+
一组5行(0.00秒)
如果在查询中使用十进制,则不会得到任何结果

mysql> SELECT INET_NTOA(ip) AS ip FROM ipaddress WHERE INET_NTOA(ip) REGEXP '[[:<:]]\.111[[:>:]]';
Empty set (0.00 sec)
mysql>从ip地址中选择INET_NTOA(ip)作为ip,其中INET_NTOA(ip)REGEXP'[[[::]];
空集(0.00秒)
如果我将搜索查询更改为.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)
mysql>从ip地址中选择INET_NTOA(ip)作为ip,其中INET_NTOA(ip)REGEXP'[[[::]];
+---------------+
|知识产权|
+---------------+
| 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行(0.00秒)

为什么.11搜索有效,而.111无效?当我使用.11搜索时,我也会得到.211结果?

您的正则表达式是自相矛盾的

您将在单词边界上限定模式,然后在要查找的字符串中包含一个非单词字符。由于“.”字符不是单词字符,因此不会有任何字符串由包含“.”的单词边界分隔

换句话说,因为“.”本身就是一个单词边界,所以您要查找的是[word boundary][word boundary][word],它不能出现

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

WHERE INET_NTOA(ip) REGEXP '\.111'

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

与您的实际问题分开,我只想指出,将ip地址存储为整数是一个奇怪的选择。你的空间很紧吗?或者你在对它们做一些奇特的数学运算?如果你将它们存储为一个(稍大一点的)字符串,你就永远不需要进行进出互联网地址格式的转换。实际上,我已经将IP地址存储为字符串很长一段时间了,但当我最近发现MySQL的INET_NTOA函数允许我将IP存储为整数时,我认为按IP地址排序是一个更好的解决方案。我同意您的观点,将它们存储为字符串是一种更简单的解决方案。如果您坚持将IP地址存储为整数,请确保将它们设置为无符号整数,否则您将得到比“127…”更大的地址截断