转换为 IP 类型
IP 类型用于存储和处理 IP 地址,包括 IPv4 和 IPv6 两种类型。IPv4 的底层存储为 uint32,而 IPv6 的底层存储为 uint128。
转换为 IPv4
FROM 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 个数字段组成,每段用点号分隔:数字。数字。数字。数字示例: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 个数字段组成,每段用点号分隔:数字。数字。数字。数字示例: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
FROM 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
- 压缩格式:
- 允许使用双冒号(::)表示一个或者多个连续的 0 组。
- 双冒号(::)在整个地址中只能出现一次。
- 只有:: 也是合法的地址,表示地址全 0
- 1:1:1::1:1:1:1:1 不是合法的,因为::没有表示连续的 0
- 以下地址都是合法并且相同的
- 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 | 成功 | 标准合法地址 |
:: | 成功 | 全 0 地址 |
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
- 压缩格式:
- 允许使用双冒号(::)表示一个或者多个连续的 0 组。
- 双冒号(::)在整个地址中只能出现一次。
- 只有:: 也是合法的地址,表示地址全 0
- 1:1:1::1:1:1:1:1 不是合法的,因为::没有表示连续的 0
- 以下地址都是合法并且相同的
- 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 | 成功 | 标准合法地址 |
:: | 成功 | 全 0 地址 |
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 位十六进制数 |
FROM IPv4
任意的 IPv4 都可以转换成 IPv6。不会出现无法转换的情况,严格模式与非严格模式的行为一致。
输入 IPv4 | 转换 IPv6 |
---|---|
192.168.0.0 | ::ffff:192.168.0.0 |
0.0.0.0 | ::ffff:0.0.0.0 |