跳到主要内容

转换为 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"null5 段(必须 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"
规则描述
  1. 标准格式:8 组十六进制数字,每组由 1 至 4 个十六进制数字组成,组与组之间用冒号分隔。例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334
  2. 压缩格式:
  • 允许使用双冒号(::)表示一个或者多个连续的 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
  1. IPv4 映射地址:
  • 允许在 IPv6 地址的后 32 位(最后两组)使用 IPv4 点分十进制格式。
  • 这种格式通常用于表示 IPv4 地址到 IPv6 的映射。
  • 例如:::ffff:192.168.89.9 等价于 ::ffff:c0a8:5909
  1. 前后可以包含任意数量的空白字符(包括空格、制表符、换行符等)。
  2. 十六进制字母可以是大写(A-F)或小写(a-f)。
  3. IPv4 部分必须遵循 IPv4 的规则:每段数字值必须在 0~255 范围内。
  4. 如果地址格式不符合上述规则,报错。
例子
输入字符串解析结果说明
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"
规则描述
  1. 标准格式:8 组十六进制数字,每组由 1 至 4 个十六进制数字组成,组与组之间用冒号分隔。例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334
  2. 压缩格式:
  • 允许使用双冒号(::)表示一个或者多个连续的 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
  1. IPv4 映射地址:
  • 允许在 IPv6 地址的后 32 位(最后两组)使用 IPv4 点分十进制格式。
  • 这种格式通常用于表示 IPv4 地址到 IPv6 的映射。
  • 例如:::ffff:192.168.89.9 等价于 ::ffff:c0a8:5909
  1. 前后可以包含任意数量的空白字符(包括空格、制表符、换行符等)。
  2. 十六进制字母可以是大写(A-F)或小写(a-f)。
  3. IPv4 部分必须遵循 IPv4 的规则:每段数字值必须在 0~255 范围内。
  4. 如果地址格式不符合上述规则,返回 null。
例子
输入字符串解析结果说明
2001:db8:85a3:0000:0000:8a2e:0370:7334成功标准合法地址
::成功全 0 地址
2001:db8::成功使用压缩格式的地址
::ffff:192.168.1.1成功IPv4 映射地址
2001:db8::1成功前后可以有空白符号
2001:db8::1::2null双冒号 (::) 出现了两次
2001:db8:85a3:0000:0000:8a2e:0370:7334:1234null超过 8 组
2001:db8:85a3:0000:8a2e:0370null只有 6 组 (必须 8 组或使用压缩格式)
2001:db8:85g3:0000:0000:8a2e:0370:7334null含非法十六进制字符'g'
2001:db8::ffff:192.168.1.260nullIPv4 部分超出范围 (260>255)
2001:db8::ffff:192.168..1nullIPv4 部分格式错误 (缺少一段)
2001:0db8:85a3:::8a2e:0370:7334null三个冒号连用
20001:db8::1null第一组超过 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