Funciones de red

SQL estándar de Google para BigQuery es compatible con las siguientes funciones de Net:

NET.IP_FROM_STRING

NET.IP_FROM_STRING(addr_str)

Descripción

Convierte una dirección IPv4 o IPv6 de formato de texto (STRING) a formato binario (BYTES) en orden de bytes de red.

Esta función admite los siguientes formatos para addr_str:

  • IPv4: notación en cuatro segmentos separados por puntos. Por ejemplo, 10.1.2.3
  • IPv6: formato separado por dos puntos. Por ejemplo, 1234:5678:90ab:cdef:1234:5678:90ab:cdef. Para obtener más ejemplos, consulta la arquitectura de direccionamiento de IP versión 6.

Esta función no admite la notación CIDR, como 10.1.2.3/32.

Si esta función recibe una entrada NULL, muestra NULL. Si la entrada se considera no válida, se produce un error OUT_OF_RANGE.

Tipo de datos mostrados

BYTES

Ejemplo

SELECT
  addr_str, FORMAT("%T", NET.IP_FROM_STRING(addr_str)) AS ip_from_string
FROM UNNEST([
  '48.49.50.51',
  '::1',
  '3031:3233:3435:3637:3839:4041:4243:4445',
  '::ffff:192.0.2.128'
]) AS addr_str;
addr_str ip_from_string
48.49.50.51 b"0123"
::1 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
3031:3233:3435:3637:3839:4041:4243:4445 b"0123456789@ABCDE"
::ffff:192.0.2.128 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\x00\x02\x80"

NET.SAFE_IP_FROM_STRING

NET.SAFE_IP_FROM_STRING(addr_str)

Descripción

Similar a NET.IP_FROM_STRING, pero muestra NULL en lugar de arrojar un error si la entrada no es válida.

Tipo de datos mostrados

BYTES

Ejemplo

SELECT
  addr_str,
  FORMAT("%T", NET.SAFE_IP_FROM_STRING(addr_str)) AS safe_ip_from_string
FROM UNNEST([
  '48.49.50.51',
  '::1',
  '3031:3233:3435:3637:3839:4041:4243:4445',
  '::ffff:192.0.2.128',
  '48.49.50.51/32',
  '48.49.50',
  '::wxyz'
]) AS addr_str;
addr_str safe_ip_from_string
48.49.50.51 b"0123"
::1 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
3031:3233:3435:3637:3839:4041:4243:4445 b"0123456789@ABCDE"
::ffff:192.0.2.128 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\x00\x02\x80"
48.49.50.51/32 NULL
48.49.50 NULL
::wxyz NULL

NET.IP_TO_STRING

NET.IP_TO_STRING(addr_bin)

Descripción Convierte una dirección IPv4 o IPv6 de formato binario (BYTES) en formato de orden de bytes de red a texto (STRING).

Si la entrada es de 4 bytes, esta función muestra una dirección IPv4 como una STRING. Si la entrada es de 16 bytes, muestra una dirección IPv6 como STRING.

Si esta función recibe una entrada NULL, muestra NULL. Si la entrada tiene una longitud diferente de 4 o 16, se produce un error OUT_OF_RANGE.

Tipo de datos mostrados

STRING

Ejemplo

SELECT FORMAT("%T", x) AS addr_bin, NET.IP_TO_STRING(x) AS ip_to_string
FROM UNNEST([
  b"0123",
  b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
  b"0123456789@ABCDE",
  b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\x00\x02\x80"
]) AS x;
addr_bin ip_to_string
b"0123" 48.49.50.51
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" ::1
b"0123456789@ABCDE" 3031:3233:3435:3637:3839:4041:4243:4445
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\x00\x02\x80" ::ffff:192.0.2.128

NET.IP_NET_MASK

NET.IP_NET_MASK(num_output_bytes, prefix_length)

Descripción

Muestra una máscara de red: una secuencia de bytes con una longitud igual a num_output_bytes, en la que los primeros bits de prefix_length se establecen en 1 y los otros bits se establecen en 0. num_output_bytes y prefix_length son INT64. Esta función muestra un error si num_output_bytes no es 4 (para IPv4) o 16 (para IPv6). También muestra un error si prefix_length es negativo o mayor que 8 * num_output_bytes.

Tipo de datos mostrados

BYTES

Ejemplo

SELECT x, y, FORMAT("%T", NET.IP_NET_MASK(x, y)) AS ip_net_mask
FROM UNNEST([
  STRUCT(4 as x, 0 as y),
  (4, 20),
  (4, 32),
  (16, 0),
  (16, 1),
  (16, 128)
]);
x y ip_net_mask
4 0 b"\x00\x00\x00\x00"
4 20 b"\xff\xff\xf0\x00"
4 32 b"\xff\xff\xff\xff"
16 0 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
16 1 b"\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
16 128 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"

NET.IP_TRUNC

NET.IP_TRUNC(addr_bin, prefix_length)

Descripción Toma addr_bin, una dirección IPv4 o IPv6 en formato binario (BYTES) en orden de bytes de red, y muestra una dirección de subred con el mismo formato. El resultado tiene la misma longitud que addr_bin, en el que los primeros bits de prefix_length son iguales a los de addr_bin y los bits restantes son 0.

Esta función arroja un error si LENGTH(addr_bin) no es 4 o 16, o si prefix_len es negativo o mayor que LENGTH(addr_bin) * 8.

Tipo de datos mostrados

BYTES

Ejemplo

SELECT
  FORMAT("%T", x) as addr_bin, prefix_length,
  FORMAT("%T", NET.IP_TRUNC(x, prefix_length)) AS ip_trunc
FROM UNNEST([
  STRUCT(b"\xAA\xBB\xCC\xDD" as x, 0 as prefix_length),
  (b"\xAA\xBB\xCC\xDD", 11), (b"\xAA\xBB\xCC\xDD", 12),
  (b"\xAA\xBB\xCC\xDD", 24), (b"\xAA\xBB\xCC\xDD", 32),
  (b'0123456789@ABCDE', 80)
]);
addr_bin prefix_length ip_trunc
b"\xaa\xbb\xcc\xdd" 0 b"\x00\x00\x00\x00"
b"\xaa\xbb\xcc\xdd" 11 b"\xaa\xa0\x00\x00"
b"\xaa\xbb\xcc\xdd" 12 b"\xaa\xb0\x00\x00"
b"\xaa\xbb\xcc\xdd" 24 b"\xaa\xbb\xcc\x00"
b"\xaa\xbb\xcc\xdd" 32 b"\xaa\xbb\xcc\xdd"
b"0123456789@ABCDE" 80 b"0123456789\x00\x00\x00\x00\x00\x00"

NET.IPV4_FROM_INT64

NET.IPV4_FROM_INT64(integer_value)

Descripción

Convierte una dirección IPv4 de formato de número entero en formato binario (BYTES) en orden de bytes de red. En la entrada de número entero, el bit de menos importancia de la dirección IP se almacena en el bit menos importante del número entero, sin importar la arquitectura del host o del cliente. Por ejemplo, 1 significa 0.0.0.1, y 0x1FF significa 0.0.1.255.

Esta función comprueba que todos los 32 bits más importantes sean 0 o que todos los 33 bits más importantes sean 1 (signo extendido desde un número entero de 32 bits). En otras palabras, la entrada debe estar en el rango [-0x80000000, 0xFFFFFFFF]; de lo contrario, esta función muestra un error.

Esta función no es compatible con IPv6.

Tipo de datos mostrados

BYTES

Ejemplo

SELECT x, x_hex, FORMAT("%T", NET.IPV4_FROM_INT64(x)) AS ipv4_from_int64
FROM (
  SELECT CAST(x_hex AS INT64) x, x_hex
  FROM UNNEST(["0x0", "0xABCDEF", "0xFFFFFFFF", "-0x1", "-0x2"]) AS x_hex
);
x x_hex ipv4_from_int64
0 0x0 b"\x00\x00\x00\x00"
11259375 0xABCDEF b"\x00\xab\xcd\xef"
4294967295 0xFFFFFFFF b"\xff\xff\xff\xff"
-1 -0x1 b"\xff\xff\xff\xff"
-2 -0x2 b"\xff\xff\xff\xfe"

NET.IPV4_TO_INT64

NET.IPV4_TO_INT64(addr_bin)

Descripción

Convierte una dirección IPv4 de formato binario (BYTES) en orden de bytes de red al formato de número entero. En la salida del número entero, el bit menos importante de la dirección IP se almacena en el bit menos importante del entero, sin importar la arquitectura del host o del cliente. Por ejemplo, 1 significa 0.0.0.1 y 0x1FF significa 0.0.1.255. El resultado está en el rango [0, 0xFFFFFFFF].

Si la longitud de entrada no es 4, esta función produce un error.

Esta función no es compatible con IPv6.

Tipo de datos mostrados

INT64

Ejemplo

SELECT
  FORMAT("%T", x) AS addr_bin,
  FORMAT("0x%X", NET.IPV4_TO_INT64(x)) AS ipv4_to_int64
FROM
UNNEST([b"\x00\x00\x00\x00", b"\x00\xab\xcd\xef", b"\xff\xff\xff\xff"]) AS x;
addr_bin ipv4_to_int64
b"\x00\x00\x00\x00" 0x0
b"\x00\xab\xcd\xef" 0xABCDEF
b"\xff\xff\xff\xff" 0xFFFFFFFF

NET.HOST

NET.HOST(url)

Descripción

Toma una URL como STRING y muestra el host como una STRING. Para obtener los mejores resultados, los valores de URL deben cumplir con el formato que define RFC 3986. Si el valor de la URL no cumple con el formato RFC 3986, esta función hace el mejor esfuerzo para analizar la entrada y mostrar un resultado relevante. Si la función no puede analizar la entrada, muestra NULL.

Nota: La función no realiza ninguna normalización.

Tipo de datos mostrados

STRING

Ejemplo

SELECT
  FORMAT("%T", input) AS input,
  description,
  FORMAT("%T", NET.HOST(input)) AS host,
  FORMAT("%T", NET.PUBLIC_SUFFIX(input)) AS suffix,
  FORMAT("%T", NET.REG_DOMAIN(input)) AS domain
FROM (
  SELECT "" AS input, "invalid input" AS description
  UNION ALL SELECT "http://abc.xyz", "standard URL"
  UNION ALL SELECT "//user:password@a.b:80/path?query",
                   "standard URL with relative scheme, port, path and query, but no public suffix"
  UNION ALL SELECT "https://[::1]:80", "standard URL with IPv6 host"
  UNION ALL SELECT "http://例子.卷筒纸.中国", "standard URL with internationalized domain name"
  UNION ALL SELECT "    www.Example.Co.UK    ",
                   "non-standard URL with spaces, upper case letters, and without scheme"
  UNION ALL SELECT "mailto:?to=&subject=&body=", "URI rather than URL--unsupported"
);
entrada descripción host sufijo dominio
"" entrada no válida NULL NULL NULL
"http://abc.xyz" URL estándar "abc.xyz" "xyz" "abc.xyz"
"//user:password@a.b:80/path?query" URL estándar con esquema relativo, puerto, ruta y consulta, pero sin sufijo público "a.b" NULL NULL
"https://[::1]:80" URL estándar con host IPv6 "[::1]" NULL NULL
"http://例子.卷筒纸.中国" URL estándar con nombre de dominio internacionalizado "例子.卷筒纸.中国" "中国" "卷筒纸.中国"
"    www.Example.Co.UK    " URL no estándar con espacios, letras mayúsculas y sin esquema "www.Example.Co.UK" "Co.UK" "Example.Co.UK"
"mailto:?to=&subject=&body=" URI en lugar de URL: no compatible "mailto" NULL NULL

NET.PUBLIC_SUFFIX

NET.PUBLIC_SUFFIX(url)

Descripción

Toma una URL como STRING y muestra el sufijo público (por ejemplo, com, org o net) como una STRING. Un sufijo público es un dominio de ICANN registrado en publicsuffix.org. Para obtener los mejores resultados, los valores de URL deben cumplir con el formato que define RFC 3986. Si el valor de la URL no cumple con el formato RFC 3986, esta función hace el mejor esfuerzo para analizar la entrada y mostrar un resultado relevante.

Esta función muestra NULL si se cumple alguna de las siguientes condiciones:

  • No puede analizar el host a partir de la entrada ingresada;
  • El host analizado contiene puntos adyacentes en el medio (no al principio ni al final); o bien
  • El host analizado no contiene ningún sufijo público.

Antes de buscar el sufijo público, esta función normaliza temporalmente el host por medio de la conversión de las letras en inglés en mayúsculas a minúsculas y la codificación de todos los caracteres que no son ASCII con Punycode. La función luego muestra el sufijo público como parte del host original en lugar del host normalizado.

Nota: La función no realiza la normalización de Unicode.

Nota: Los datos del sufijo público en publicsuffix.org también contienen dominios privados. Esta función ignora los dominios privados.

Nota: Los datos del sufijo público pueden cambiar con el tiempo. En consecuencia, la entrada que produce un resultado NULL ahora puede producir un valor distinto de NULL en el futuro.

Tipo de datos mostrados

STRING

Ejemplo

SELECT
  FORMAT("%T", input) AS input,
  description,
  FORMAT("%T", NET.HOST(input)) AS host,
  FORMAT("%T", NET.PUBLIC_SUFFIX(input)) AS suffix,
  FORMAT("%T", NET.REG_DOMAIN(input)) AS domain
FROM (
  SELECT "" AS input, "invalid input" AS description
  UNION ALL SELECT "http://abc.xyz", "standard URL"
  UNION ALL SELECT "//user:password@a.b:80/path?query",
                   "standard URL with relative scheme, port, path and query, but no public suffix"
  UNION ALL SELECT "https://[::1]:80", "standard URL with IPv6 host"
  UNION ALL SELECT "http://例子.卷筒纸.中国", "standard URL with internationalized domain name"
  UNION ALL SELECT "    www.Example.Co.UK    ",
                   "non-standard URL with spaces, upper case letters, and without scheme"
  UNION ALL SELECT "mailto:?to=&subject=&body=", "URI rather than URL--unsupported"
);
entrada descripción host sufijo dominio
"" entrada no válida NULL NULL NULL
"http://abc.xyz" URL estándar "abc.xyz" "xyz" "abc.xyz"
"//user:password@a.b:80/path?query" URL estándar con esquema relativo, puerto, ruta y consulta, pero sin sufijo público "a.b" NULL NULL
"https://[::1]:80" URL estándar con host IPv6 "[::1]" NULL NULL
"http://例子.卷筒纸.中国" URL estándar con nombre de dominio internacionalizado "例子.卷筒纸.中国" "中国" "卷筒纸.中国"
"    www.Example.Co.UK    " URL no estándar con espacios, letras mayúsculas y sin esquema "www.Example.Co.UK" "Co.UK" "Example.Co.UK
"mailto:?to=&subject=&body=" URI en lugar de URL: no compatible "mailto" NULL NULL

NET.REG_DOMAIN

NET.REG_DOMAIN(url)

Descripción

Toma una URL como una STRING y muestra el dominio registrado o registrable (el sufijo público más una etiqueta anterior), como una STRING. Para obtener los mejores resultados, los valores de URL deben cumplir con el formato que define RFC 3986. Si el valor de la URL no cumple con el formato RFC 3986, esta función hace el mejor esfuerzo para analizar la entrada y mostrar un resultado relevante.

Esta función muestra NULL si se cumple alguna de las siguientes condiciones:

  • No puede analizar el host a partir de la entrada ingresada;
  • El host analizado contiene puntos adyacentes en el medio (no al principio ni al final);
  • El host analizado no contiene ningún sufijo público; o bien
  • El host analizado contiene solo un sufijo público sin ninguna etiqueta anterior.

Antes de buscar el sufijo público, esta función normaliza temporalmente el host por medio de la conversión de las letras mayúsculas en inglés a minúsculas y la codificación de todos los caracteres no ASCII con Punycode. Luego, la función muestra el dominio registrado o registrable como parte del host original en lugar del host normalizado.

Nota: La función no realiza la normalización de Unicode.

Nota: Los datos del sufijo público en publicsuffix.org también contienen dominios privados. Esta función no trata un dominio privado como un sufijo público. Por ejemplo, si "us.com" es un dominio privado en los datos del sufijo público, NET.REG_DOMAIN ("foo.us.com") muestra "us.com" (el sufijo público "com" más la etiqueta anterior "us") en lugar de "foo.us.com" (el dominio privado "us.com" más la etiqueta anterior "foo").

Nota: Los datos del sufijo público pueden cambiar con el tiempo. En consecuencia, la entrada que produce un resultado NULL ahora puede producir un valor distinto de NULL en el futuro.

Tipo de datos mostrados

STRING

Ejemplo

SELECT
  FORMAT("%T", input) AS input,
  description,
  FORMAT("%T", NET.HOST(input)) AS host,
  FORMAT("%T", NET.PUBLIC_SUFFIX(input)) AS suffix,
  FORMAT("%T", NET.REG_DOMAIN(input)) AS domain
FROM (
  SELECT "" AS input, "invalid input" AS description
  UNION ALL SELECT "http://abc.xyz", "standard URL"
  UNION ALL SELECT "//user:password@a.b:80/path?query",
                   "standard URL with relative scheme, port, path and query, but no public suffix"
  UNION ALL SELECT "https://[::1]:80", "standard URL with IPv6 host"
  UNION ALL SELECT "http://例子.卷筒纸.中国", "standard URL with internationalized domain name"
  UNION ALL SELECT "    www.Example.Co.UK    ",
                   "non-standard URL with spaces, upper case letters, and without scheme"
  UNION ALL SELECT "mailto:?to=&subject=&body=", "URI rather than URL--unsupported"
);
entrada descripción host sufijo dominio
"" entrada no válida NULL NULL NULL
"http://abc.xyz" URL estándar "abc.xyz" "xyz" "abc.xyz"
"//user:password@a.b:80/path?query" URL estándar con esquema relativo, puerto, ruta y consulta, pero sin sufijo público "a.b" NULL NULL
"https://[::1]:80" URL estándar con host IPv6 "[::1]" NULL NULL
"http://例子.卷筒纸.中国" URL estándar con nombre de dominio internacionalizado "例子.卷筒纸.中国" "中国" "卷筒纸.中国"
"    www.Example.Co.UK    " URL no estándar con espacios, letras mayúsculas y sin esquema "www.Example.Co.UK" "Co.UK" "Example.Co.UK"
"mailto:?to=&subject=&body=" URI en lugar de URL: no compatible "mailto" NULL NULL