# IPv6

`IPv6` stores a validated IPv6 address. Display uses lowercase hexadecimal and compressed groups of zeros. Ordering compares address values rather than their text spellings.

## Syntax

```text
IPv6
```

Invalid addresses raise `TYPE_MISMATCH`. Casting to BLOB exposes the 16 network-order bytes. An IPv4-mapped IPv6 address compares equal to its [IPv4](https://coordinatordb.com/docs/reference/data-types/ipv4) counterpart.

A top-level column permits SQL `NULL` unless it declares `NOT NULL`. Use the `inet` and `cidr` types when the value must also retain a subnet prefix.

## Examples

### Normalizing an address

```sql
SELECT CAST('2001:DB8:0:0:0:0:0:1' AS IPv6)
FORMAT csv;
```

```text
"2001:db8::1"
```

### Comparing IPv4-mapped addresses

```sql
SELECT CAST('127.0.0.1' AS IPv4)
     = CAST('::ffff:127.0.0.1' AS IPv6)
FORMAT csv;
```

```text
1
```

### Storing client addresses

```sql
CREATE TABLE clients(id UInt32, ip IPv6);
INSERT INTO clients VALUES (1, '2001:db8::1'), (2, '2001:db8::2');
```

```sql
SELECT id, ip
FROM clients
ORDER BY ip
FORMAT csv;
```

```text
1,"2001:db8::1"
2,"2001:db8::2"
```

See [IP address functions](https://coordinatordb.com/docs/reference/functions/regular-functions/ip-address-functions) for address and subnet operations.
