PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Xác định quốc gia từ IP - IPv6

Tôi tin rằng tôi đã tìm ra giải pháp. Nó liên quan đến việc sửa đổi dữ liệu trước và sau đó là chỉnh sửa dữ liệu đầu vào. Đây là những gì đã hoạt động.

Đầu tiên, dữ liệu cần được chuyển đổi sao cho tất cả các địa chỉ đều đầy đủ, không bị rút ngắn, với dấu chấm phẩy bị loại bỏ. Dữ liệu mẫu được hiển thị trong câu hỏi của tôi được chuyển đổi thành:

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

Đây là những gì được lưu trữ trong cơ sở dữ liệu.

Bước tiếp theo là chuyển đổi địa chỉ IP nhận được trong mã thành ở cùng một định dạng. Điều này được thực hiện bằng PHP với mã sau (giả sử rằng $ip_address là địa chỉ IPv6 đến):

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

Bây giờ biến $ip_adress sẽ chứa địa chỉ IPv6 đầy đủ, chẳng hạn như

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

và như vậy.

Bây giờ bạn có thể đơn giản so sánh địa chỉ đầy đủ này với các phạm vi trong cơ sở dữ liệu. Tôi đã thêm một hàm thứ hai vào cơ sở dữ liệu để xử lý các địa chỉ IPv6, trông giống như sau:

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;

Cuối cùng, trong mã php của mình, tôi đã thêm mã gọi một hoặc hàm Postgres khác dựa trên ip_address đầu vào.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xây dựng hình ảnh trung tâm docker keycloak trong openshift từ lệnh ứng dụng mới

  2. Kích hoạt so với kiểm tra ràng buộc

  3. Cách liệt kê các chỉ mục được tạo cho bảng trong postgres

  4. Cách bật Truy vấn Postgis trong Spark SQL

  5. Cập nhật mảng PostgreSQL bằng SQLAlchemy