본문 바로가기
MySql

MySQL How to match an ip address in mysql?

by 베이스 공부 2021. 1. 13.
반응형

예를 들어, 이와 같은 데이터를 저장하는 열이 있습니다.

Apple
12.5.126.40
Smite
Abby
127.0.0.1
56.5.4.8
9876543210
Notes

IP 형식의 데이터가있는 행만 선택하는 방법은 무엇입니까?

'^ [0-9] {1,3} \. [0-9] {1,3} \. [0-9] {1,3} \. [0-9]로 시도했습니다. {1,3} $ ' 하지만 왜 9876543210과 일치하는지 모르겠습니다.

 

해결 방법

 

IP 주소가 점으로 구분 된 쿼드 패턴과 일치하려면 REGEX 를 사용해야합니다.

SELECT *
FROM yourtable
WHERE 
  thecolumn REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$'

기술적으로 이것은 999.999.999.999 와 같이 유효한 IP 주소가 아닌 값과 일치하지만 중요하지 않을 수 있습니다. 중요한 것은 데이터를 수정하여 IP 주소가 여기에있는 다른 데이터와 분리 된 자체 열에 저장되도록하는 것입니다. 하나의 열에 데이터 유형을 혼합하는 것은 거의 항상 나쁜 생각입니다.

mysql> SELECT '9876543210' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$';
+---------------------------------------------------------------------------+
| '9876543210' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$' |
+---------------------------------------------------------------------------+
|                                                                         0 |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT '987.654.321.0' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$';
+------------------------------------------------------------------------------+
| '987.654.321.0' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$' |
+------------------------------------------------------------------------------+
|                                                                            1 |
+------------------------------------------------------------------------------+


이 방법은 정규 표현식보다 더 효율적입니다.

다음과 같은 WHERE 조건에 삽입 할 수 있습니다. WHERE INET_ATON (thecolumn) IS NOT NULL

SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
|             2130706433 |
+------------------------+

SELECT INET_ATON('notes');
+--------------------+
| INET_ATON('notes') |
+--------------------+
|               NULL |
+--------------------+

SELECT INET_ATON('56.99.9999.44');
+----------------------------+
| INET_ATON('56.99.9999.44') |
+----------------------------+
|                       NULL |
+----------------------------+

 

참조 페이지 https://stackoverflow.com/questions/14699056

 

 

반응형

댓글