VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
INET_ATON()과 비트 연산을 사용합니다. VillageSQL의 INET 타입은 같은 쿼리를 더 읽기 쉽게 만들고 IPv4와 IPv6 모두에서 동작하는 네트워크 함수를 제공합니다.
표준 방식: 비트 연산 범위 검사
IPv4에서INET_ATON()은 주소를 부호 없는 32비트 정수로 변환합니다. 서브넷 소속 검사는 비트 AND입니다: (ip & netmask) == network_address이면 그 IP는 서브넷 안에 있습니다.
BETWEEN 방식은 읽기 쉽습니다. 비트 연산 형태는 서브넷 매개변수가 변수일 때 더 조합하기 좋습니다.
어느 방식도 IPv6에서는 동작하지 않습니다 — INET_ATON()은 IPv4만 처리합니다.
VillageSQL과 함께: INET 열의 네트워크 함수
VillageSQL의vsql_network_address 확장은 “이 주소가 저 서브넷 안에 있는가”에 직접 답하는 포함 술어 — inet_contained_by(), inet_contains(), inet_overlaps() — 와, 검사를 직접 구성하기 위한 inet_network(), inet_set_masklen(), inet_compare()를 제공합니다. 모두 IPv4와 IPv6 INET 열 양쪽에서 동작합니다.
서브넷 포함 쿼리
저장된 IP가 서브넷에 속하는지 확인하려면, 주소를 서브넷의 프리픽스 길이로 마스킹하고 그 결과를 대상 네트워크와 비교합니다:포함 술어
이 확장은 PostgreSQL의 5가지 포함 술어를 함수로 제공합니다. 2개의INET 값을 받아 1, 0, 또는 NULL을 반환합니다:
위의 서브넷 쿼리는 호출 하나가 됩니다:
192.168.1.5/24와 192.168.1.9/24는 같은 네트워크이고, 엄격한 형태는 이 둘에 대해 0을 반환하며 _or_equals 형태는 1을 반환합니다. 주소 체계가 다른 두 주소는 결코 일치하지 않습니다: IPv4 값을 IPv6 값과 비교하면 오류를 내지 않고 0을 반환하며, 이는 PostgreSQL과 같습니다.
두 인수 모두 INET이어야 합니다. CIDR 값은 강제 변환되지 않습니다:
inet_from_string()을 대신 사용하세요. 이 함수들은 vsql_network_address 0.0.5에서 추가되었습니다.
inet_compare를 사용한 범위 기반 포함
모든 행에서 네트워크를 다시 계산하지 않는 대안입니다 — 브로드캐스트 주소를 알고 있을 때 유용합니다:IPv6 서브넷 쿼리(같은 패턴)
같은inet_network() 방식이 아무 변경 없이 IPv6에서도 동작합니다:
네트워크 테이블 패턴
흔한 사용 사례: 허가된 CIDR을 담은networks 테이블과, 들어오는 IP가 그중 어느 하나에라도 속하는지 확인하기.
표준 대 VillageSQL
자주 묻는 질문
VillageSQL에 PostgreSQL의 << 포함 연산자가 있나요?
같은 동작이 연산자가 아니라 함수로 있습니다: <<에는 inet_contained_by(), >>에는 inet_contains(), <<=와 >>=에는 _or_equals 변형, 그리고 &&에는 inet_overlaps()입니다. 포함 술어를 보세요.
서브넷 쿼리는 인덱스를 사용하나요?
cidr_to_string(inet_network(inet_set_masklen(...))) 패턴은 인덱스 스캔을 사용하지 않습니다 — 모든 행에서 네트워크 주소를 다시 계산합니다. 큰 테이블에서는 inet_compare 범위 방식이 쿼리를 ip_address 열에 대한 범위로 표현하므로 인덱스에 더 친화적입니다.
서브넷을 저장하면서 동시에 포함 여부를 조회할 수 있나요?
예. 호스트 주소와 서브넷을 모두INET 열에 저장하고 inet_contained_by(host_ip, subnet)으로 비교하세요. 서브넷이 CIDR 열에 있으면 먼저 변환하세요 — 포함 술어는 양쪽 모두 INET을 받고 CIDR을 강제 변환하지 않습니다.
문제 해결
함께 보기
- MySQL에서 IP 주소 저장하기 — 서브넷 쿼리에 사용하는 INET 타입
- MySQL에서 IPv6 저장하기 — INET을 사용하면 서브넷 쿼리는 IPv6에서도 같은 방식으로 동작합니다
- MySQL에서 IP로 지리 위치 조회하기 — 서브넷을 넘어 IP 데이터로 더 나아가기