inet 확장
inet 확장 (inet Extension)
inet 확장은 IPv4와 IPv6 인터넷 주소를 저장하기 위한 INET 데이터 타입을 정의해요. 서브넷 마스크를 위한 CIDR 표기법(예: 198.51.100.0/22, 2001:db8:3c4d::/48)을 지원해요.
출처: 문서
본문
설치하고 로드하기 (Installing and Loading)
inet 확장은 첫 사용 시 공식 확장 저장소에서 자동으로 autoload돼요. 직접 설치하고 로드하려면 다음을 실행해요.
INSTALL inet;
LOAD inet;
예시 (Examples)
SELECT '127.0.0.1'::INET AS ipv4, '2001:db8:3c4d::/48'::INET AS ipv6;
| ipv4 | ipv6 |
|---|---|
| 127.0.0.1 | 2001:db8:3c4d::/48 |
CREATE TABLE tbl (id INTEGER, ip INET);
INSERT INTO tbl VALUES
(1, '192.168.0.0/16'),
(2, '127.0.0.1'),
(3, '8.8.8.8'),
(4, 'fe80::/10'),
(5, '2001:db8:3c4d:15::1a2f:1a2b');
SELECT * FROM tbl;
| id | ip |
|---|---|
| 1 | 192.168.0.0/16 |
| 2 | 127.0.0.1 |
| 3 | 8.8.8.8 |
| 4 | fe80::/10 |
| 5 | 2001:db8:3c4d:15::1a2f:1a2b |
INET 값에 대한 연산 (Operations on INET Values)
INET 값은 자연스럽게 비교할 수 있고, IPv4가 IPv6보다 먼저 정렬돼요. 또한 IP 주소에 정수를 더하거나 빼서 IP 주소를 수정할 수 있어요.
CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('127.0.0.1'::INET + 10),
('fe80::10'::INET - 9),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b');
SELECT cidr FROM tbl ORDER BY cidr ASC;
| cidr |
|---|
| 127.0.0.1 |
| 127.0.0.11 |
| 2001:db8:3c4d:15::1a2f:1a2b |
| fe80::7 |
host 함수 (host Function)
INET 값의 host 구성요소는 HOST() 함수로 추출할 수 있어요.
CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.0.0/16'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, host(cidr) AS host FROM tbl;
| cidr | host |
|---|---|
| 192.168.0.0/16 | 192.168.0.0 |
| 127.0.0.1 | 127.0.0.1 |
| 2001:db8:3c4d:15::1a2f:1a2b/96 | 2001:db8:3c4d:15::1a2f:1a2b |
netmask 함수 (netmask Function)
주소가 속한 네트워크의 네트워크 마스크를 계산해요.
CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.5/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, netmask(cidr) AS netmask FROM tbl;
| cidr | netmask |
|---|---|
| 192.168.1.5/24 | 255.255.255.0/24 |
| 127.0.0.1 | 255.255.255.255 |
| 2001:db8:3c4d:15::1a2f:1a2b/96 | ffff:ffff:ffff:ffff:ffff:ffff::/96 |
network 함수 (network Function)
주소의 네트워크 부분을 반환하는데, 넷마스크 오른쪽의 값은 0으로 채워요.
CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.5/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, network(cidr) AS network FROM tbl;
| cidr | network |
|---|---|
| 192.168.1.5/24 | 192.168.1.0/24 |
| 127.0.0.1 | 127.0.0.1 |
| 2001:db8:3c4d:15::1a2f:1a2b/96 | 2001:db8:3c4d:15::/96 |
broadcast 함수 (broadcast Function)
주소가 속한 네트워크의 브로드캐스트 주소를 계산해요.
CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.5/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, broadcast(cidr) AS broadcast FROM tbl;
| cidr | broadcast |
|---|---|
| 192.168.1.5/24 | 192.168.1.255/24 |
| 127.0.0.1 | 127.0.0.1 |
| 2001:db8:3c4d:15::1a2f:1a2b/96 | 2001:db8:3c4d:15::ffff:ffff/96 |
<<= 술어 (<<= Predicate)
서브넷이 다른 서브넷에 포함되거나 같으면 참을 반환해요.
CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.0/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, INET '192.168.1.5/32' <<= cidr AS subnet_contained FROM tbl;
| cidr | subnet_contained |
|---|---|
| 192.168.1.0/24 | true |
| 127.0.0.1 | false |
| 2001:db8:3c4d:15::1a2f:1a2b/96 | false |
>>= 술어 (>>= Predicate)
서브넷이 다른 서브넷을 포함하거나 같으면 참을 반환해요.
CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.0/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, INET '192.168.0.0/16' >>= cidr AS subnet_contains FROM tbl;
| cidr | subnet_contains |
|---|---|
| 192.168.1.0/24 | true |
| 127.0.0.1 | false |
| 2001:db8:3c4d:15::1a2f:1a2b/96 | false |
HTML 이스케이프/언이스케이프 함수 (HTML Escape and Unescape Functions)
SELECT html_escape('&');
┌──────────────────┐
│ html_escape('&') │
│ varchar │
├──────────────────┤
│ & │
└──────────────────┘
SELECT html_unescape('&');
┌────────────────────────┐
│ html_unescape('&') │
│ varchar │
├────────────────────────┤
│ & │
└────────────────────────┘