최종 수정: 에
IP 타입으로 형 변환
IP 타입은 IPv4 및 IPv6 타입을 포함하며, IP 주소를 저장하고 처리하는 데 사용됩니다. IPv4는 uint32로 저장되고, IPv6는 uint128로 저장됩니다.
IPv4로 형 변환
String에서 변환
엄격 모드
BNF 정의
<ipv4> ::= <whitespace>* <octet> "." <octet> "." <octet> "." <octet> <whitespace>*
<octet> ::= <digit> | <digit><digit> | <digit><digit><digit>
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
규칙 설명
IPv4 주소는 점으로 구분된 4개의 숫자 구간으로 구성됩니다. 형식은 number.number.number.number이며, 예를 들면 192.168.1.1입니다. 각 구간은 0에서 255 사이여야 합니다. 숫자 앞에 영을 붙일 수 있습니다. 주소 앞뒤에는 공백 문자(스페이스, 탭, 줄바꿈 등)를 개수 제한 없이 넣을 수 있습니다.
형식에 맞지 않으면 오류가 발생합니다.
예제
| 입력 문자열 | 파싱 결과 | 설명 |
|---|---|---|
| "192.168.1.1" | 성공 | 표준 형식의 유효한 주소 |
| "0.0.0.0" | 성공 | 최솟값 경계 |
| "255.255.255.255" | 성공 | 최댓값 경계 |
| "10.20.30.40" | 성공 | 일반적인 주소 |
| " 192.168.1.1 " | 성공 | 앞뒤에 공백을 넣을 수 있음 |
| "192.168.01.1" | 성공 | 숫자 앞에 영을 붙일 수 있음 (01 = 1) |
| "1.2.3" | 오류 | 구간이 3개뿐임 (4개여야 함) |
| "1.2.3.4.5" | 오류 | 구간이 5개임 (4개여야 함) |
| "256.0.0.1" | 오류 | 첫 번째 구간 > 255 (256은 범위를 벗어남) |
| "1.300.2.3" | 오류 | 두 번째 구간 > 255 |
| "1.2.3." | 오류 | 네 번째 구간이 누락됨 |
| ".1.2.3" | 오류 | 첫 번째 구간이 누락됨 |
| "1..2.3" | 오류 | 두 번째 구간이 누락됨 |
| "a.b.c.d" | 오류 | 숫자가 아닌 문자 |
| "1.2.+3.4" | 오류 | 부호 +는 허용되지 않음 |
비엄격 모드
BNF 정의
<ipv4> ::= <whitespace>* <octet> "." <octet> "." <octet> "." <octet> <whitespace>*
<octet> ::= <digit> | <digit><digit> | <digit><digit><digit>
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
규칙 설명
IPv4 주소는 점으로 구분된 4개의 숫자 구간으로 구성됩니다. 형식은 number.number.number.number이며, 예를 들면 192.168.1.1입니다. 각 구간은 0에서 255 사이여야 합니다. 숫자 앞에 영을 붙일 수 있습니다. 주소 앞뒤에는 공백 문자(스페이스, 탭, 줄바꿈 등)를 개수 제한 없이 넣을 수 있습니다.
형식에 맞지 않으면 null을 반환합니다.
예제
| 입력 문자열 | 파싱 결과 | 설명 |
|---|---|---|
| "192.168.1.1" | 성공 | 표준 형식의 유효한 주소 |
| "0.0.0.0" | 성공 | 최솟값 경계 |
| "255.255.255.255" | 성공 | 최댓값 경계 |
| "10.20.30.40" | 성공 | 일반적인 주소 |
| " 192.168.1.1 " | 성공 | 앞뒤에 공백을 넣을 수 있음 |
| "192.168.01.1" | 성공 | 숫자 앞에 영을 붙일 수 있음 (01 = 1) |
| "1.2.3" | null | 구간이 3개뿐임 (4개여야 함) |
| "1.2.3.4.5" | null | 구간이 5개임 (4개여야 함) |
| "256.0.0.1" | null | 첫 번째 구간 > 255 (256은 범위를 벗어남) |
| "1.300.2.3" | null | 두 번째 구간 > 255 |
| "1.2.3." | null | 네 번째 구간이 누락됨 |
| ".1.2.3" | null | 첫 번째 구간이 누락됨 |
| "1..2.3" | null | 두 번째 구간이 누락됨 |
| "a.b.c.d" | null | 숫자가 아닌 문자 |
| "1.2.+3.4" | null | 부호 +는 허용되지 않음 |
IPv6로 형 변환
String에서 변환
동작 변경
4.0 이전 버전의 Doris는 IPv6 주소 형식에 대한 제약이 더 느슨했습니다. 예를 들면 다음과 같습니다.
- 여러 개의 콜론이 연속으로 나오는 형식을 허용(예: '1:1:::1')
- 실제로 생략되는 부분이 없어도 이중 콜론을 허용(예: '1:1:1::1:1:1:1:1')
4.0 버전부터는 이 두 가지 비표준 형식에 대해 엄격 모드에서는 오류가 발생하고, 비엄격 모드에서는 null을 반환합니다.
엄격 모드
BNF 정의
<ipv6> ::= <whitespace>* <ipv6-standard> <whitespace>*
| <whitespace>* <ipv6-compressed> <whitespace>*
| <whitespace>* <ipv6-ipv4-mapped> <whitespace>*
<ipv6-standard> ::= <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16>
<h16> ::= <hexdigit>{1,4}
<hexdigit> ::= <digit> | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F"
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
규칙 설명
- 표준 형식: 콜론으로 구분된 8개의 십육진수 그룹으로 구성되며, 각 그룹은 십육진수 1~4자리입니다. 예: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
- 압축 형식:
- 이중 콜론(::)으로 영으로만 이루어진 연속된 그룹을 하나 이상 나타낼 수 있습니다.
- 이중 콜론(::)은 전체 주소에서 한 번만 사용할 수 있습니다.
- ::만으로도 유효한 주소이며, 모두 영인 주소를 나타냅니다.
- 1:1:1::1:1:1:1:1은 ::가 연속된 영을 나타내지 않으므로 유효하지 않습니다.
- 다음 주소는 모두 유효하며 동일한 주소를 나타냅니다.
- 2001:0db8:0000:0000:0000:0000:1428:57ab
- 2001:0db8:0000:0000:0000::1428:57ab
- 2001:0db8:0:0:0:0:1428:57ab
- 2001:0db8:0::0:1428:57ab
- 2001:0db8::1428:57ab
- IPv4 매핑 주소:
- IPv6 주소의 마지막 32비트(마지막 두 그룹)에 IPv4의 점으로 구분된 십진수 형식을 사용할 수 있습니다.
- 이 형식은 일반적으로 IPv4 주소를 IPv6에 매핑하여 나타내는 데 사용됩니다.
- 예: ::ffff:192.168.89.9는 ::ffff:c0a8:5909와 동일합니다.
- 주소 앞뒤에는 공백 문자(스페이스, 탭, 줄바꿈 등)를 개수 제한 없이 넣을 수 있습니다.
- 십육진수에 쓰이는 영문자는 대문자(A-F) 또는 소문자(a-f)를 사용할 수 있습니다.
- IPv4 부분은 IPv4 규칙을 따라야 합니다. 각 구간은 0에서 255 사이여야 합니다.
- 주소 형식이 위 규칙에 맞지 않으면 오류가 발생합니다.
예제
| 입력 문자열 | 파싱 결과 | 설명 |
|---|---|---|
| 2001:db8:85a3:0000:0000:8a2e:0370:7334 | 성공 | 표준 형식의 유효한 주소 |
| :: | 성공 | 모두 영인 주소 |
| 2001:db8:: | 성공 | 압축 형식 사용 |
| ::ffff:192.168.1.1 | 성공 | IPv4 매핑 주소 |
| 2001:db8::1 | 성공 | 앞뒤에 공백을 넣을 수 있음 |
| 2001:db8::1::2 | 오류 | 이중 콜론(::)이 두 번 나타남 |
| 2001:db8:85a3:0000:0000:8a2e:0370:7334:1234 | 오류 | 그룹이 8개를 초과함 |
| 2001:db8:85a3:0000:8a2e:0370 | 오류 | 그룹이 6개뿐임 (8개이거나 압축 형식을 사용해야 함) |
| 2001:db8:85g3:0000:0000:8a2e:0370:7334 | 오류 | 유효하지 않은 십육진수 문자 'g'가 포함됨 |
| 2001:db8::ffff:192.168.1.260 | 오류 | IPv4 부분이 범위를 벗어남 (260 > 255) |
| 2001:db8::ffff:192.168..1 | 오류 | IPv4 부분의 형식 오류 (구간 누락) |
| 2001:0db8:85a3:::8a2e:0370:7334 | 오류 | 콜론 세 개가 연속으로 나타남 |
| 20001:db8::1 | 오류 | 첫 번째 그룹의 십육진수 자릿수가 4자리를 초과함 |
비엄격 모드
BNF 정의
<ipv6> ::= <whitespace>* <ipv6-standard> <whitespace>*
| <whitespace>* <ipv6-compressed> <whitespace>*
| <whitespace>* <ipv6-ipv4-mapped> <whitespace>*
<ipv6-standard> ::= <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16>
<h16> ::= <hexdigit>{1,4}
<hexdigit> ::= <digit> | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F"
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
규칙 설명
- 표준 형식: 콜론으로 구분된 8개의 십육진수 그룹으로 구성되며, 각 그룹은 십육진수 1~4자리입니다. 예: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
- 압축 형식:
- 이중 콜론(::)으로 영으로만 이루어진 연속된 그룹을 하나 이상 나타낼 수 있습니다.
- 이중 콜론(::)은 전체 주소에서 한 번만 사용할 수 있습니다.
- ::만으로도 유효한 주소이며, 모두 영인 주소를 나타냅니다.
- 1:1:1::1:1:1:1:1은 ::가 연속된 영을 나타내지 않으므로 유효하지 않습니다.
- 다음 주소는 모두 유효하며 동일한 주소를 나타냅니다.
- 2001:0db8:0000:0000:0000:0000:1428:57ab
- 2001:0db8:0000:0000:0000::1428:57ab
- 2001:0db8:0:0:0:0:1428:57ab
- 2001:0db8:0::0:1428:57ab
- 2001:0db8::1428:57ab
- IPv4 매핑 주소:
- IPv6 주소의 마지막 32비트(마지막 두 그룹)에 IPv4의 점으로 구분된 십진수 형식을 사용할 수 있습니다.
- 이 형식은 일반적으로 IPv4 주소를 IPv6에 매핑하여 나타내는 데 사용됩니다.
- 예: ::ffff:192.168.89.9는 ::ffff:c0a8:5909와 동일합니다.
- 주소 앞뒤에는 공백 문자(스페이스, 탭, 줄바꿈 등)를 개수 제한 없이 넣을 수 있습니다.
- 십육진수에 쓰이는 영문자는 대문자(A-F) 또는 소문자(a-f)를 사용할 수 있습니다.
- IPv4 부분은 IPv4 규칙을 따라야 합니다. 각 구간은 0에서 255 사이여야 합니다.
- 주소 형식이 위 규칙에 맞지 않으면 null을 반환합니다.
예제
| 입력 문자열 | 파싱 결과 | 설명 |
|---|---|---|
| 2001:db8:85a3:0000:0000:8a2e:0370:7334 | 성공 | 표준 형식의 유효한 주소 |
| :: | 성공 | 모두 영인 주소 |
| 2001:db8:: | 성공 | 압축 형식 사용 |
| ::ffff:192.168.1.1 | 성공 | IPv4 매핑 주소 |
| 2001:db8::1 | 성공 | 앞뒤에 공백을 넣을 수 있음 |
| 2001:db8::1::2 | null | 이중 콜론(::)이 두 번 나타남 |
| 2001:db8:85a3:0000:0000:8a2e:0370:7334:1234 | null | 그룹이 8개를 초과함 |
| 2001:db8:85a3:0000:8a2e:0370 | null | 그룹이 6개뿐임 (8개이거나 압축 형식을 사용해야 함) |
| 2001:db8:85g3:0000:0000:8a2e:0370:7334 | null | 유효하지 않은 십육진수 문자 'g'가 포함됨 |
| 2001:db8::ffff:192.168.1.260 | null | IPv4 부분이 범위를 벗어남 (260 > 255) |
| 2001:db8::ffff:192.168..1 | null | IPv4 부분의 형식 오류 (구간 누락) |
| 2001:0db8:85a3:::8a2e:0370:7334 | null | 콜론 세 개가 연속으로 나타남 |
| 20001:db8::1 | null | 첫 번째 그룹의 십육진수 자릿수가 4자리를 초과함 |
IPv4에서 변환
모든 IPv4 주소는 IPv6로 변환할 수 있습니다. 변환은 항상 성공하며, 엄격 모드와 비엄격 모드에서 동일하게 동작합니다.
| 입력 IPv4 | 변환된 IPv6 |
|---|---|
| 192.168.0.0 | ::ffff:192.168.0.0 |
| 0.0.0.0 | ::ffff:0.0.0.0 |