首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

三步將純真IP數據庫導入 MySQL:vi 處理與 mysqlimport 實戰

     編輯:MySQL 資料庫相關知識

純真 IP 數據庫(QQWry.dat)導入 MySQL 完整教程

純真 IP 數據庫是國內廣泛使用的離線 IP 歸屬地查詢庫。本文演示如何在 Linux 環境下,僅用 vi 與 mysqlimport 三步完成文本化 IP 數據入庫。

前置條件

  • Linux 系統,具備 vi 基礎操作
  • MySQL 命令行工具可用(或 phpMyAdmin)
  • 已下載並解壓純真數據為 ip.txt

步驟 1:獲取並解壓數據

# 假設已下載 QQWry.dat,使用工具(如 ipconvert)導出文本
# 最終得到四列:起始IP、結束IP、地區、說明
# 列間以不定數量空格分隔,說明欄位內部可能含空格

步驟 2:vi 批量替換分隔符

需將前三列的空格替換為分號 ;,保留說明欄內部空格。

vi ip.txt
# 在 vi 命令模式下連續執行 3 次:
:%s/\s\+/;/
# 解析:%s 全局替換,\s 匹配空白,\+ 貪婪匹配連續空白,替換為 ;
# 執行三次分別處理第1、2、3列間的空格
:wq

原理: 每次替換只處理行首第一組連續空格,故執行三次恰好轉換前三列分隔符。

步驟 3:建表並導入

3.1 建立目標表

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 排序規則,避免中文亂碼。

3.2 使用 mysqlimport 導入

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;

常見問題排查

  1. 亂碼:確認表字符集、導入連接字符集、源文件編碼三者一致(均為 GBK)。
  2. 分隔符衝突:若說明欄含分號,可選用其他極少用字符(如 |)並同步修改 vi 替換命令與 --fields-terminated-by。
  3. 大文件效能:數百萬行時,考慮 LOAD DATA INFILE 替代 mysqlimport,並暫停索引、外鍵檢查。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved