> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL용 vsql_network_address 확장 기능

> vsql_network_address 확장 기능은 INET, CIDR, MACADDR, MACADDR8 열 유형을 MySQL에 추가하며, 포함, 넷마스크, 비교 함수를 제공합니다.

`VARCHAR`에 보관한 IP 주소는 알파벳순으로 정렬되고, 오타를 받아들이며, 주소가
네트워크 안에 속하는지 답할 수 없습니다. `vsql_network_address`는 입력을
검증하고, 올바르게 정렬되며, 포함 관계와 넷마스크 함수를 함께 제공하는 열 유형
네 가지를 추가합니다. PostgreSQL의 `inet`, `cidr`, `macaddr`, `macaddr8` 유형을
따릅니다.

| | |
| - | - |
| **관리자** | VillageSQL |
| **소스 및 전체 문서** | [villagesql/vsql-network-address](https://github.com/villagesql/vsql-network-address) |
| **라이선스** | GPL-2.0 |

## 설치

설치 스크립트, Docker 이미지 또는 릴리스 tarball로 VillageSQL을 설치했다면
`vsql_network_address.veb`는 이미 서버의 `lib/veb/` 디렉터리에 있습니다. 문
하나로 서버에 설치하세요:

```sql theme={null}
INSTALL EXTENSION vsql_network_address;
```

설치되었는지 확인합니다:

```sql theme={null}
SELECT EXTENSION_NAME
FROM INFORMATION_SCHEMA.EXTENSIONS
WHERE EXTENSION_NAME = 'vsql_network_address';
```

```
+----------------------+
| EXTENSION_NAME       |
+----------------------+
| vsql_network_address |
+----------------------+
```

직접 빌드하려면 [저장소](https://github.com/villagesql/vsql-network-address)의
빌드 지침을 따르세요.

## 추가되는 기능

### 유형

| 유형 | 저장 내용 | 바이트 |
| - | - | - |
| `INET` | 선택적 넷마스크가 있는 호스트 주소, IPv4 또는 IPv6 | 19 |
| `CIDR` | 네트워크 주소 | 19 |
| `MACADDR` | 6바이트 하드웨어 주소 | 6 |
| `MACADDR8` | 8바이트 하드웨어 주소 | 8 |

```sql theme={null}
CREATE TABLE hosts (
    id    INT PRIMARY KEY,
    label VARCHAR(16),
    addr  INET,
    mac   MACADDR
);
```

### 함수

| 함수 | 반환값 | 설명 |
| - | - | - |
| `inet_from_string(s)`, `inet_to_string(a)` | `INET`, text | 텍스트와 `INET` 사이를 변환 |
| `cidr_from_string(s)`, `cidr_to_string(c)` | `CIDR`, text | `CIDR`에 대해 같은 역할 |
| `macaddr_from_string(s)`, `macaddr_to_string(m)` | `MACADDR`, text | `MACADDR`에 대해 같은 역할 |
| `macaddr8_from_string(s)`, `macaddr8_to_string(m)` | `MACADDR8`, text | `MACADDR8`에 대해 같은 역할 |
| `inet_compare(a, b)`, `cidr_compare(a, b)`, `macaddr_compare(a, b)`, `macaddr8_compare(a, b)` | int | -1, 0 또는 1 |
| `inet_contains(a, b)` | int | `a`가 `b`를 엄격하게 포함하면 1 |
| `inet_contains_or_equals(a, b)` | int | `a`가 `b`를 포함하거나 같으면 1 |
| `inet_contained_by(a, b)` | int | `a`가 `b` 안에 엄격하게 속하면 1 |
| `inet_contained_by_or_equals(a, b)` | int | `a`가 `b` 안에 속하거나 같으면 1 |
| `inet_overlaps(a, b)` | int | 한쪽이 다른 쪽을 포함하거나 둘이 같으면 1 |
| `inet_family(a)` | int | 4 또는 6 |
| `inet_masklen(a)` | int | 넷마스크 길이 |
| `inet_set_masklen(a, n)`, `cidr_set_masklen(c, n)` | `INET`, `CIDR` | 같은 주소에 다른 넷마스크를 적용 |
| `inet_host(a)`, `inet_text(a)`, `inet_abbrev(a)`, `cidr_abbrev(c)` | text | 마스크 없는 주소, 마스크 있는 주소, 축약 형식 |
| `inet_netmask(a)`, `inet_hostmask(a)` | `INET` | 넷마스크와 그 보수 |
| `inet_broadcast(a)` | `INET` | 포함하는 네트워크의 브로드캐스트 주소 |
| `inet_network(a)` | `CIDR` | 주소가 속한 네트워크 |
| `macaddr_trunc(m)` | `MACADDR` | 마지막 3바이트를 0으로 만들어 제조사 접두사만 남김 |

## 예제

```sql theme={null}
INSERT INTO hosts VALUES
    (1, 'gateway', '192.168.1.1/24',  '00:1b:63:84:45:e6'),
    (2, 'printer', '192.168.1.50/24', '3c:22:fb:aa:01:02'),
    (3, 'vpn',     '10.8.0.7/16',     '00:1b:63:84:45:e7');

SELECT label, addr, inet_masklen(addr) AS mask, inet_family(addr) AS family
FROM hosts ORDER BY addr;
```

```
+---------+-----------------+------+--------+
| label   | addr            | mask | family |
+---------+-----------------+------+--------+
| vpn     | 10.8.0.7/16     |   16 |      4 |
| gateway | 192.168.1.1/24  |   24 |      4 |
| printer | 192.168.1.50/24 |   24 |      4 |
+---------+-----------------+------+--------+
```

행은 알파벳순이 아니라 주소순으로 돌아옵니다. 텍스트 순서라면 `9.0.0.1`이 `10.8.0.7` 뒤에 오지만, 주소 순서에서는 앞에 옵니다.

어떤 호스트가 네트워크에 속하는지 물어봅니다:

```sql theme={null}
SELECT label FROM hosts
WHERE inet_contained_by_or_equals(addr, inet_from_string('192.168.1.0/24')) = 1;
```

```
+---------+
| label   |
+---------+
| gateway |
| printer |
+---------+
```

네트워크와 그 브로드캐스트 주소를 구합니다:

```sql theme={null}
SELECT inet_network(inet_from_string('192.168.1.50/24')) AS network,
       inet_broadcast(inet_from_string('192.168.1.50/24')) AS broadcast;
```

```
+----------------+------------------+
| network        | broadcast        |
+----------------+------------------+
| 192.168.1.0/24 | 192.168.1.255/24 |
+----------------+------------------+
```

> [!NOTE]
>
> `inet_contained_by`는 엄격하므로, 네트워크와 같은 넷마스크를 가진 주소는 그
> 네트워크에 포함되지 않습니다. `192.168.1.0/24` 안의 `192.168.1.5/32`는 1을
> 반환하지만, 같은 네트워크 안의 `192.168.1.5/24`는 0을 반환합니다. 위의 예제처럼
> 저장된 행이 네트워크 자체의 마스크를 가질 때는 `inet_contained_by_or_equals`를
> 사용하세요.

## 참고 항목

* [MySQL에 IP 주소 저장하기](https://villagesql.com/docs/en/guides/storing-ip-addresses.md) — INET, VARCHAR, 정수 중 선택하기
* [서브넷 쿼리](https://villagesql.com/docs/en/guides/subnet-queries.md) — 포함, 겹침, 그리고 각각의 의미
* [MAC 주소 저장하기](https://villagesql.com/docs/en/guides/storing-mac-addresses.md) — MACADDR과 MACADDR8 비교
* [확장 기능 설치](https://villagesql.com/docs/ko/extensions/install.md) — `INSTALL EXTENSION`의 동작 방식과 서버가 번들을 찾는 위치
* [사용 가능한 확장 기능](https://villagesql.com/docs/ko/extensions/catalog) — 전체 카탈로그
* [villagesql/vsql-network-address](https://github.com/villagesql/vsql-network-address) — 소스, 빌드 지침, 알려진 제한 사항


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.