VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
VARCHAR(45)로 저장합니다. 동작은 하지만 공간을 낭비하고, 형식을 전혀 검증하지 않으며, 숫자 순이 아니라 사전 순으로 정렬합니다 — 그래서 192.168.1.10이 192.168.1.9보다 앞에 정렬됩니다. VillageSQL의 INET 타입은 이 모든 것을 해결하고 IPv4와 IPv6을 같은 열에서 처리합니다.
MySQL 기본: VARCHAR
단순한 접근법:VARCHAR(45)는 주어진 문자열을 무엇이든 저장합니다. 검증이 없습니다 — 'not-an-ip'도 오류 없이 삽입됩니다. 정렬은 숫자 순서를 따르지 않고, 서브넷과 비교하려면 문자열 조작이나 변환 함수가 필요합니다.
표준 우회책: INT UNSIGNED + INET_ATON
IPv4의 경우 MySQL의INET_ATON()이 점으로 구분된 십진수 문자열을 4바이트 정수로 변환합니다. 이것은 간결하고 올바르게 정렬됩니다:
INT UNSIGNED는 128비트 주소를 담을 수 없습니다. IPv6에는 VARBINARY(16)과 INET6_ATON() / INET6_NTOA()가 필요하므로, IPv6 지원이 필요해지면 스키마 변경을 해야 합니다.
VillageSQL과 함께: INET 타입
VillageSQL의vsql_network_address 확장은 IPv4와 IPv6 주소를 모두 간결한 바이너리 형식으로 저장하는 네이티브 INET 타입을 추가합니다 — 두 패밀리 모두 행당 고정 19바이트이며 IPv4 값은 그 너비까지 패딩됩니다 — 그리고 입력을 들어오는 시점에 검증합니다.
inet_from_string()이 Warning 3200과 함께 NULL을 반환하므로 행은 NULL 값으로 삽입됩니다. 잘못된 입력이 삽입을 실패시키게 하려면 열을 NOT NULL로 선언하세요.
저장된 주소 다루기
인덱싱
저장 방식 선택하기
내장 검증과 함께 IPv4와 IPv6이 모두 필요한 새 스키마에는
INET이 가장 깔끔한 선택입니다. VillageSQL 의존성이 없는 IPv4 전용 스키마에는 INET_ATON / INET_NTOA를 사용한 INT UNSIGNED가 확립된 접근법입니다.
저장된 주소에 대한 서브넷 쿼리는 MySQL에서 서브넷으로 쿼리하기를 참조하세요.
자주 묻는 질문
INET은 192.168.1.5/24처럼 넷마스크가 있는 주소를 저장할 수 있나요?
예.INET은 호스트 비트를 허용합니다 — 192.168.1.5/24는 유효합니다. 호스트 비트가 0이어야 한다고(순수 네트워크 주소) 강제하고 싶다면 대신 CIDR 타입을 사용하세요.
INET은 삽입 시 주소를 검증하나요?
예.inet_from_string('not-an-ip')는 쓰레기 값을 저장하는 대신 NULL을 반환합니다. NOT NULL 제약 조건이 있는 INET 열에 NULL을 전달하면 삽입이 실패합니다.
ORDER BY ip_address는 IPv4/IPv6이 섞인 경우 어떻게 정렬하나요?
IPv4 주소가 IPv6 주소보다 앞에 정렬됩니다. 각 패밀리 안에서는 주소가 숫자 순으로 정렬됩니다. 이것은 PostgreSQL의 INET 정렬 순서와 같습니다.INET은 PostgreSQL의 inet 타입과 같나요?
기능적으로는 그렇습니다 — 같은 타입(INET, CIDR, MACADDR, MACADDR8), 같은 함수 명명 규칙, 같은 검증 규칙입니다. 주된 차이는 VillageSQL이 비교와 서브넷 검사에 연산자가 아니라 함수를 제공한다는 점입니다.문제 해결
함께 보기
- MySQL의 IPv6 저장 — INET 타입을 사용한 통합 IPv4 및 IPv6 저장
- MySQL에서 서브넷으로 쿼리하기 — INET을 사용해 네트워크 범위로 행 필터링하기
- MySQL에서 IP로 지리 위치 조회하기 — IP 주소에 지리 데이터 더하기
- MySQL에 MAC 주소 저장하기 — 하드웨어 주소에 대한 같은 접근법