我无法理解为什么我从 IP 地址的 MySQL 查询中得到以下结果。我将 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)
这是将 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)
如果我将搜索查询更改为 0.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 结果?