sql >> Databáze >  >> RDS >> PostgreSQL

Určete zemi z IP - IPv6

Věřím, že jsem našel řešení. Zahrnuje nejprve úpravu dat a poté určité masírování vstupu. Tady je to, co fungovalo.

Nejprve je potřeba data převést tak, aby všechny adresy byly plné, bez krácení, s odstraněnými středníky. Ukázková data uvedená v mé otázce jsou převedena na:

 t_start                          | t_end                            | t_country_code
----------------------------------+----------------------------------+----------------
 00000000000000000000000000000000 | 00ffffffffffffffffffffffffffffff | ZZ
 01000000000000000000000000000000 | 01ffffffffffffffffffffffffffffff | ZZ
...
 20000000000000000000000000000000 | 2000ffffffffffffffffffffffffffff | ZZ
...
 20011200000000000000000000000000 | 20011200ffffffffffffffffffffffff | MX
...

To je to, co je uloženo v databázi.

Dalším krokem bylo převést IP adresu přijatou v kódu na stejný formát. To se provádí v PHP pomocí následujícího kódu (předpokládejme, že $ip_address je příchozí adresa IPv6):

$addr_bin = inet_pton($ip_address);                                                                                                              
$bytes = unpack('n*', $addr_bin);
$ip_address = implode('', array_map(function ($b) {return sprintf("%04x", $b); }, $bytes));

Nyní proměnná $ip_adress bude například obsahovat úplnou adresu IPv6

:: => 00000000000000000000000000000000
2001:1200::ab => 200112000000000000000000000000ab

a tak dále.

Nyní můžete jednoduše porovnat tuto úplnou adresu s rozsahy v databázi. Přidal jsem do databáze druhou funkci pro práci s adresami IPv6, která vypadá takto:

CREATE OR REPLACE FUNCTION get_country_for_ipv6(character varying)
  RETURNS character varying AS
$BODY$
declare
    ip  ALIAS for $1;
    ccode   varchar;
begin
    select into ccode t_country_code from ipv6_to_country where addr between n_from and n_to limit 1;
    if ccode is null then
        ccode := '';
    end if;
    return ccode;
end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Nakonec jsem do svého php kódu přidal kód, který volá jednu nebo druhou funkci Postgres na základě vstupní ip_address.



  1. SQL - Jak vybrat řádek se sloupcem s maximální hodnotou

  2. mysql utf8mb4_unicode_ci způsobit jedinečnou kolizi klíče

  3. Přehled možností JSON v PostgreSQL

  4. Ukončí používání zavře otevřené připojení SQL