IPアドレスから場所を特定するデータベースの利用

GeoLiteCityの設定の仕方

データを取得
wget http://www.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity_20061201.zip

解凍する
unzip GeoLiteCity_20061201.zip

名前変更(登録時に問題が出るため)
mv GeoLiteCity-Blocks.csv locip.csv
mv GeoLiteCity-Location.csv lookup.csv

mysqlに入って
データベース作成
CREATE DATABASE geoip;

テーブル作成
IPテーブル
CREATE TABLE locip (
start_ip INT UNSIGNED NOT NULL,
end_ip INT UNSIGNED NOT NULL,
locId INT UNSIGNED NOT NULL
);

場所テーブル
CREATE TABLE lookup (
locId INT UNSIGNED NOT NULL,
country CHAR(15) NOT NULL,
region CHAR(2) NOT NULL,
city CHAR(30) NOT NULL,
postalcode CHAR(15) NOT NULL,
latitude CHAR(15) NOT NULL,
longitude CHAR(15) NOT NULL,
dmaCode CHAR(15) NOT NULL,
areaCode CHAR(15) NOT NULL
);

データの注入
mysqlimport –d -L -v -u geo -p -r –fields-terminated-by=’,’ –fields-enclosed-by='”‘ geoip locip.csv

mysql> select count(start_ip) from locip;
+—————–+
| count(start_ip) |
+—————–+
|ツꀀ ツꀀツꀀ ツꀀツꀀ ツꀀ2815167 |
+—————–+
1 row in set (0.01 sec)

mysqlimport –d -L -v -u geo -p -r –fields-terminated-by=’,’ –fields-enclosed-by='”‘ geoip lookup.csv

mysql> use geoip;
mysql> select count(*) from lookup;
+———-+
| count(*) |
+———-+
|ツꀀ ツꀀ188641 |
+———-+
1 row in set (0.00 sec)

テスト
Host name: www.google.com
IP address: 66.249.89.99

16777216*(66) + 65536*(249) + 256*(89) + 99;

mysql> SELECT locId FROM locip WHERE 1123637603 >= start_ip AND 1123637603 <= end_ip;
+——-+
| locId |
+——-+
|ツꀀ 2571 |
+——-+
1 row in set (2.75 sec)

mysql> SELECT * FROM lookup WHERE locId=2571;
+——-+———+——–+—————+————+———-+———–+———+———-+
| locId | country | region | cityツꀀ ツꀀツꀀ ツꀀツꀀ ツꀀ | postalcode | latitude | longitude | dmaCode | areaCode |
+——-+———+——–+—————+————+———-+———–+———+———-+
|ツꀀ 2571 | USツꀀ ツꀀツꀀ ツꀀ| CAツꀀ ツꀀツꀀ | Mountain View | 94043ツꀀ ツꀀツꀀ ツꀀ| 37.4192ツꀀ | -122.0574 | 807ツꀀ ツꀀツꀀ | 650ツꀀ ツꀀツꀀ ツꀀ|
+——-+———+——–+—————+————+———-+———–+———+———-+
1 row in set (0.97 sec)

IPアドレスから場所を特定するデータベースの利用