> ## 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.

# Extensão vsql_network_address para MySQL

> A extensão vsql_network_address adiciona ao MySQL os tipos de coluna INET, CIDR, MACADDR e MACADDR8, com funções de contenção, máscara de rede e comparação.

Um endereço IP guardado em um `VARCHAR` é ordenado alfabeticamente, aceita
erros de digitação e não consegue responder se um endereço está dentro de uma
rede. O `vsql_network_address` adiciona quatro tipos de coluna que validam a
sua entrada, ordenam corretamente e vêm com as funções de contenção e máscara
de rede que os acompanham. Ele segue os tipos `inet`, `cidr`, `macaddr` e
`macaddr8` do PostgreSQL.

| | |
| - | - |
| **Mantenedor** | VillageSQL |
| **Código-fonte e documentação completa** | [villagesql/vsql-network-address](https://github.com/villagesql/vsql-network-address) |
| **Licença** | GPL-2.0 |

## Instalar

O `vsql_network_address.veb` já está no diretório `lib/veb/` do servidor se
você instalou o VillageSQL com o script de instalação, a imagem Docker ou um
tarball de release. Instale-o no servidor com uma única instrução:

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

Confirme que ele está lá:

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

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

Para compilá-lo você mesmo, siga as instruções de compilação no
[repositório](https://github.com/villagesql/vsql-network-address).

## O que ela adiciona

### Os tipos

| Tipo | Guarda | Bytes |
| - | - | - |
| `INET` | Um endereço de host com uma máscara de rede opcional, IPv4 ou IPv6 | 19 |
| `CIDR` | Um endereço de rede | 19 |
| `MACADDR` | Um endereço de hardware de 6 bytes | 6 |
| `MACADDR8` | Um endereço de hardware de 8 bytes | 8 |

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

### Funções

| Função | Retorna | O que faz |
| - | - | - |
| `inet_from_string(s)`, `inet_to_string(a)` | `INET`, texto | Converte entre texto e `INET` |
| `cidr_from_string(s)`, `cidr_to_string(c)` | `CIDR`, texto | O mesmo para `CIDR` |
| `macaddr_from_string(s)`, `macaddr_to_string(m)` | `MACADDR`, texto | O mesmo para `MACADDR` |
| `macaddr8_from_string(s)`, `macaddr8_to_string(m)` | `MACADDR8`, texto | O mesmo para `MACADDR8` |
| `inet_compare(a, b)`, `cidr_compare(a, b)`, `macaddr_compare(a, b)`, `macaddr8_compare(a, b)` | int | -1, 0 ou 1 |
| `inet_contains(a, b)` | int | 1 quando `a` contém `b` estritamente |
| `inet_contains_or_equals(a, b)` | int | 1 quando `a` contém `b` ou é igual a ele |
| `inet_contained_by(a, b)` | int | 1 quando `a` está estritamente dentro de `b` |
| `inet_contained_by_or_equals(a, b)` | int | 1 quando `a` está dentro de `b` ou é igual a ele |
| `inet_overlaps(a, b)` | int | 1 quando um contém o outro, ou são iguais |
| `inet_family(a)` | int | 4 ou 6 |
| `inet_masklen(a)` | int | O comprimento da máscara de rede |
| `inet_set_masklen(a, n)`, `cidr_set_masklen(c, n)` | `INET`, `CIDR` | O mesmo endereço com uma máscara de rede diferente |
| `inet_host(a)`, `inet_text(a)`, `inet_abbrev(a)`, `cidr_abbrev(c)` | texto | O endereço sem a máscara, com ela, e em formas abreviadas |
| `inet_netmask(a)`, `inet_hostmask(a)` | `INET` | A máscara de rede e o seu complemento |
| `inet_broadcast(a)` | `INET` | O endereço de broadcast da rede que o contém |
| `inet_network(a)` | `CIDR` | A rede à qual o endereço pertence |
| `macaddr_trunc(m)` | `MACADDR` | Os três últimos bytes zerados, deixando o prefixo do fabricante |

## Exemplo

```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 |
+---------+-----------------+------+--------+
```

As linhas voltam em ordem de endereço, e não em ordem alfabética. A ordem textual colocaria `9.0.0.1` depois de `10.8.0.7`; a ordem de endereço o coloca antes.

Pergunte quais hosts estão em uma rede:

```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 |
+---------+
```

Derive a rede e o seu endereço de broadcast:

```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]
>
> O `inet_contained_by` é estrito, então um endereço que carrega a mesma
> máscara de rede que a rede não está contido nela. `192.168.1.5/32` dentro de
> `192.168.1.0/24` retorna 1, enquanto `192.168.1.5/24` dentro da mesma rede
> retorna 0. Use `inet_contained_by_or_equals` quando as linhas armazenadas
> carregam a própria máscara da rede, como faz o exemplo acima.

## Veja também

* [Armazenando endereços IP no MySQL](https://villagesql.com/docs/en/guides/storing-ip-addresses.md) — escolhendo entre INET, VARCHAR e um inteiro
* [Consultas de sub-rede](https://villagesql.com/docs/en/guides/subnet-queries.md) — contenção, sobreposição e o que cada uma significa
* [Armazenando endereços MAC](https://villagesql.com/docs/en/guides/storing-mac-addresses.md) — MACADDR em comparação com MACADDR8
* [Instalar extensões](https://villagesql.com/docs/pt-BR/extensions/install.md) — como o `INSTALL EXTENSION` funciona e onde o servidor procura um bundle
* [Extensões disponíveis](https://villagesql.com/docs/pt-BR/extensions/catalog) — o catálogo completo
* [villagesql/vsql-network-address](https://github.com/villagesql/vsql-network-address) — código-fonte, instruções de compilação e as limitações conhecidas


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