2013-10-07 1 views
1

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이 모두 있습니다. 내가 검색 0.11을 사용할 때

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) 

왜 0.11 검색 작업과 0.111가 작동하지 것입니다, 나는뿐만 아니라 0.211 결과를 얻을?

+0

실제 질문과는 별도로 IP 주소를 정수로 저장하는 것이 궁금합니다. 우주에서 아주 단단합니까? 아니면 그들에게 멋진 수학을하고 있습니까? 문자열을 (약간 큰) 문자열로 저장하면 인터넷 주소 형식으로 변환하거나 변환하지 않아도됩니다. –

+0

나는 공간이 부족하지 않다. 실제로 IP 주소를 오랫동안 문자열로 저장했지만 IP 주소를 정수로 저장할 수있는 MySQL의 INET_NTOA 함수를 발견했을 때 IP 주소로 정렬 할 때 더 나은 솔루션이라고 생각했습니다. 문자열로 저장하는 것이 더 쉬운 솔루션이라는 점에 동의합니다. – Marc

답변

1

정규 표현식은 자기 모순입니다.

단어 경계에 경계선을 지정한 다음 찾고자하는 문자열에 단어가 아닌 문자를 포함시킵니다. '.' 문자는 단어 문자가 아니며 '.'문자가 포함 된 단어 경계로 구분 된 문자열이 없습니다.

다른 말로하면, '.' 그 자체가 단어 경계라면, 당신은 [단어 경계] [단어 경계] [단어]를 찾고 있습니다.

그냥 정규 표현식에 단어 경계를 꺼내 :

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

IP 주소를 정수로 저장하는 일을 계속하는 경우 지정되지 않은 정수로 지정해야합니다. 그렇지 않으면 127보다 큰 주소의 주소가 잘 리게됩니다. ... ' –

1

에서 [[:> :]] 단어를 사용하고 영숫자 문자 또는 밑줄을 사용하여 구분합니다. 점은 영숫자가 아닙니다. 단어가 분리되지 않은 문자열에서 분리 된 단어에 대해 loking을 수행합니다 (점은 단어의 일부 임). 그냥 사용 WHERE INET_NTOA(ip) like "%.111"