打造MySQL版的最新IP資料庫

2022-07-22 20:00:16 字數 3331 閱讀 3216

現在不少人上qq都用顯ip版,不僅能顯示好友的ip位址,還能夠顯示其ip對應的地方,有時可以精確到某城市的某個網咖,甚至可以精確到某棟樓的某房間。

這項功能還可以放到論壇或其他網頁上用於顯示來客的位置,也可以放在計數統計系統中用於統計客流**。

對於php+mysql構建的**,如果我們能把ip資料庫儲存在mysql資料庫中,就能方便的實現上述功能。但是網上找的mysql版的ip資料庫往往比較陳舊,而ip位址資料庫卻日新月異。既然沒有現成的,咱們就來diy乙個最新的好了。

材料:獲取最新ip資料庫的工具,現在很多顯ip版的qq都自帶,在qq的資料夾下找找有沒有下圖的這個showip.exe檔案:

接著點選「解壓」按鈕,可以把資料庫儲存為文字格式,輸入檔名儲存。

0.0.0.0          0.255.255.255    iana   cz88.net

1.0.0.0          1.0.0.0          iana   cz88.net

1.0.0.1          1.255.255.255    美國   cz88.net

2.0.0.0          2.255.255.255    iana   cz88.net

3.0.0.0          3.255.255.255    美國 紐澤西通用電氣公司

4.0.0.0          4.10.255.255     美國   cz88.net

4.11.0.0         4.11.255.255     美國 夏威夷

4.12.0.0         4.19.77.255      美國   cz88.net

4.19.78.0        4.19.78.255      美國 西南政法大學

4.19.79.0        4.19.79.63       美國 armed forces radio/television

4.19.79.64       4.21.177.111     美國   cz88.net

4.21.177.112     4.21.177.127     美國 kraft group

4.21.177.128     4.21.177.255     美國 南新漢普郡學院

...

每一行是乙個ip段,資料依次是段起始位址、段結束位址、地理位置。資料與資料之間是數量不等的若干的空格,而不是tab。我們用查詢替換把不確定 數目的連續空格全部替換為一種統一的分隔符,這裡以「||」為例,這可以用正規表示式實現。我這裡用一種土方法,在文字編輯器的「查詢」欄中輸入 「          」(9個空格,因為最大的間隔就是9個空格),「替換」欄輸入分隔符「||」,然後全部替換。完成後把「查詢」改成8個空格,「替換」不改,再全部替換。 然後再7個、6個空格,直到全部空格都變成分隔符。這時文字變成如下格式:

0.0.0.0||0.255.255.255||iana||cz88.net

1.0.0.0||1.0.0.0||iana||cz88.net

1.0.0.1||1.255.255.255||美國||cz88.net

2.0.0.0||2.255.255.255||iana||cz88.net

3.0.0.0||3.255.255.255||美國||紐澤西通用電氣公司

4.0.0.0||4.10.255.255||美國||cz88.net

4.11.0.0||4.11.255.255||美國||夏威夷

4.12.0.0||4.19.77.255||美國||cz88.net

4.19.78.0||4.19.78.255||美國||西南政法大學

4.19.79.0||4.19.79.63||美國||armed||forces||radio/television

4.19.79.64||4.21.177.111||美國||cz88.net

4.21.177.112||4.21.177.127||美國||kraft||group

4.21.177.128||4.21.177.255||美國||南新漢普郡學院

...

檔案末尾還有些垃圾,刪掉後,把這個檔案儲存為ip.txt。接著我們用一段php指令碼把這個ip.txt轉換成sql語句指令碼,好匯入到mysql。首先要設計乙個mysql表用於存放ip資料。我的是這樣設計的:

create table ip_data (

ipstart int unsigned not null,

ipend int unsigned not null,

region varchar(50) not null,

address varchar(100) not null,

primary key (ipstart, ipend)

) type = myisam;

由於ip位址本質上是乙個32位的2進製整數,所以我們用int unsigned整形來儲存。我將每個ip段(就是ip.txt的一行)的段結束位址後第乙個分隔符前的內容作為region,剩餘部分作為 address。讀者在實際使用時應根據具體情況設計具體的資料表,相應地,轉換格式的php指令碼也應修改。下面給出根據我的資料表製作的php指令碼:

<?php

function encodeip($strdotquadip)

$arrlines = file("ip.txt");

$intlen = 0;

$i = 1;

$resfile = fopen("ip".$i.".sql", "w");

foreach ($arrlines as $k => $strline)

$strsql = "insert into ip_data (ipstart, ipend, region, address) values (".$intipstart.", ".$intipend.", '".trim($arrelements[2])."', '".trim($straddress)."');\r\n";

fwrite($resfile, $strsql);

$intlen += strlen($strsql);

if ($intlen > 921600)

}

?>

指令碼儲存為ip.php,然後在命令列下執行php ip.php,稍等片刻,即生成若干個sql檔案。我的這個php指令碼按900k大小分割檔案,最後生成了34個sql檔案。讀者實際使用時應根據伺服器的php和mysql接收資料的配置選擇分割檔案依據的大小。

最後把這些sql檔案送到mysql執行即可得到diy的mysql版的最新ip資料庫

**:

MYSQL 分組查詢最新的資料

第一種前提是資料表設計id自增select from t user where id in select max id from t user group by user id 第二種對子查詢進行limit限制,適用於明確資料量不會超過多少的場景,否則查不到全部資料select from selec...

mysql分組查詢最新資料

select user id,sbp,dbp,pulse from p bp as a,select max id as id,max measure at as measure at from p bp as b group by user id as b where a.id b.id and ...

MySQL 獲取最新插入資料的id

select identity identity 返回為跨所有作用域的當前會話中的某個表生成的最新標識值。插入資料之後,不管是再執行什麼操作 除了插入資料之後的更新 查詢 刪除等 只用該方法查詢到的id,都是最後插入資料對應的id。例如 插入一條id為10,name為 李四 的資料,之後不管是再執行...