在下載到碼農很忙 IP 地址資料庫后,我們可以將其存盤在 PostgreSQL 資料庫中,并在需要查詢某個 IP 對應的位置資料時,通過 SQL 陳述句獲取正確的結果,這是一種很便捷的使用方式,并且在增加了恰當的索引后,可以取得不錯的搜索效果,
PostgreSQL 資料庫內置了 inet 和 range 兩個資料型別,用來表示一個網路地址和數值范圍,為了達到更高的查詢速度,我們可以自定義一個名為 inet_rang 的資料型別,用于表示一個網路地址的范圍:
CREATE TYPE inet_range AS RANGE (subtype=inet);
之后,需要在 PostgreSQL 中新建資料表:t_ip_data ,并為 ip_rang 搜索列增加 GiST 索引:
-- ----------------------------
-- Table structure for t_ip_data
-- ----------------------------
DROP TABLE IF EXISTS "public"."t_ip_data";
CREATE TABLE "public"."t_ip_data" (
"id" serial4,
"ip_begin" inet NOT NULL,
"ip_end" inet NOT NULL,
"ip_range" "public"."inet_range",
"cc" varchar(255) COLLATE "pg_catalog"."default",
"continent" varchar(255) COLLATE "pg_catalog"."default",
"flag" varchar(255) COLLATE "pg_catalog"."default",
"country" varchar(255) COLLATE "pg_catalog"."default",
"province" varchar(255) COLLATE "pg_catalog"."default",
"city" varchar(255) COLLATE "pg_catalog"."default",
"tag" varchar(255) COLLATE "pg_catalog"."default",
"isp" varchar(255) COLLATE "pg_catalog"."default"
)
;
-- ----------------------------
-- Indexes structure for table t_ip_data
-- ----------------------------
CREATE INDEX "t_ip_data_IPRange_idx" ON "public"."t_ip_data" USING gist (
"ip_range" "pg_catalog"."range_ops"
);
-- ----------------------------
-- Primary Key structure for table t_ip_data
-- ----------------------------
ALTER TABLE "public"."t_ip_data" ADD CONSTRAINT "t_ip_data_pkey" PRIMARY KEY ("id");
之后,使用 Navicat 等工具,將碼農很忙 IP 地址資料庫中的資料匯入到資料表 t_ip_data 中,注意欄位對應:

如果不是第一次匯入資料,注意將【匯入模式】設定為【復制】:

資料匯入成功后,需要使用以下 SQL 陳述句對 ip_range 進行修正:
UPDATE t_ip_data SET ip_range = ('[' ||ip_begin || ',' || ip_end || ']') :: inet_range
之后,就可以使用以下 SQL 陳述句進行資料查詢:
SELECT * FROM t_ip_data WHERE ip_range @> '要查詢的 IPv4 地址' :: inet
示例查詢如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/1167.html
標籤:PostgreSQL
