2013-10-07 63 views
1

我無法理解爲什麼我從IP地址的MySQL查詢中得到以下結果。我將IP地址存儲爲INTEGERS。MYSQL REGEXP INET_NTOA 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) 

如果將搜索查詢更改爲.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搜索工作和0.111不行,當我用0.11搜索,我得到了0.211的結果呢?

+0

與您的實際問題不同,我只想說,將IP地址存儲爲整數是個奇怪的選擇。你太緊張了嗎?還是你在對他們做一些奇特的數學?如果將它們存儲爲(稍大)字符串,則不需要進行互聯網地址格式轉換。 –

+0

我在空間上不緊張。實際上,我已經將IP地址存儲爲字符串很長一段時間,但是當我最近發現MySQL的INET_NTOA函數允許我將IP作爲整數存儲時,我認爲這對於按IP地址排序來說是更好的解決方案。我同意你將它們存儲爲字符串是一個更簡單的解決方案。 – Marc

回答

1

你的正則表達式是自相矛盾的。

您正在將單詞邊界綁定到您的模式,然後在要查找的字符串中包含非單詞字符。自從'。'以來。字符不是單詞字符,將不會有任何字符串由包含'。'的單詞邊界分隔。

換言之,自'。'本身就是一個單詞邊界,你正在尋找[單詞邊界] [單詞邊界] [單詞],這是不可能發生的。

只要取出字邊界在REGEXP:

WHERE INET_NTOA(ip) REGEXP '\.111' 
+0

如果您堅持將IP地址存儲爲整數,請務必將它們設置爲UNSIGNED整數,否則您將獲得截斷比127更低的地址。 ......」 –

1

的[[:>:]]用於單詞和分離使用字母數字字符或下劃線。點不是字母數字。你在拼寫單詞不分隔的字符串中的分隔詞(點是詞的一部分)。 只是使用WHERE INET_NTOA(ip) like "%.111"