純真 IP 數據庫是國內廣泛使用的離線 IP 歸屬地查詢庫。本文演示如何在 Linux 環境下,僅用 vi 與 mysqlimport 三步完成文本化 IP 數據入庫。
vi 基礎操作ip.txt# 假設已下載 QQWry.dat,使用工具(如 ipconvert)導出文本
# 最終得到四列:起始IP、結束IP、地區、說明
# 列間以不定數量空格分隔,說明欄位內部可能含空格
需將前三列的空格替換為分號 ;,保留說明欄內部空格。
vi ip.txt
# 在 vi 命令模式下連續執行 3 次:
:%s/\s\+/;/
# 解析:%s 全局替換,\s 匹配空白,\+ 貪婪匹配連續空白,替換為 ;
# 執行三次分別處理第1、2、3列間的空格
:wq
原理: 每次替換只處理行首第一組連續空格,故執行三次恰好轉換前三列分隔符。
CREATE TABLE `ips` (
`ip_start` VARCHAR(16) NOT NULL,
`ip_end` VARCHAR(16) DEFAULT NULL,
`region` VARCHAR(128) DEFAULT NULL,
`comments` VARCHAR(512) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
關鍵點: region、comments 設為 gbk_chinese_ci 排序規則,避免中文亂碼。
mysqlimport -p你的密碼 \
--local \
--delete \
--fields-terminated-by=';' \
ips ip.txt
參數解析:
--local:從客戶端讀取文件--delete:導入前清空表(配合定時任務更新)--fields-terminated-by=';':指定欄位分隔符ips 必須與文件名 ip.txt(去除擴展名)一致-- 查詢某 IP 歸屬(需將 IP 轉長整數)
SELECT * FROM ips
WHERE INET_ATON('114.114.114.114') BETWEEN CAST(ip_start AS UNSIGNED) AND CAST(ip_end AS UNSIGNED)
LIMIT 1;
|)並同步修改 vi 替換命令與 --fields-terminated-by。LOAD DATA INFILE 替代 mysqlimport,並暫停索引、外鍵檢查。