全国郵便番号データをMySQLへインポートする方法です。一度やってしまうと1年くらいはほったらかし状態のため、毎回やり方を模索しながらインポートしているので備忘録代わりです。
郵便番号データを用意する
まずは郵便局のホームページからCSVデータをダウンロードしてきます。
読み仮名データの促音・拗音を小書きで表記するもの – 日本郵便
標準ではlzhファイルのダウンロードとなっているので、「zip形式でのダウンロード」をクリックするとダウンロードリンクzipファイルに変わります。
ダウンロードファイルを解凍すると「KEN_ALL.CSV」ファイルができます。文字コードははShft-JISになっており、でそのままExcelで開くこともできます。
中身はこのようなフォーマットです。
01101,”060 “,”0600000″,”ホッカイドウ”,”サッポロシチュウオウク”,”イカニケイサイガナイバアイ”,”北海道”,”札幌市中央区”,”以下に掲載がない場合”,0,0,0,0,0,0
01101,”064 “,”0640941″,”ホッカイドウ”,”サッポロシチュウオウク”,”アサヒガオカ”,”北海道”,”札幌市中央区”,”旭ケ丘”,0,0,1,0,0,0
01101,”060 “,”0600041″,”ホッカイドウ”,”サッポロシチュウオウク”,”オオドオリヒガシ”,”北海道”,”札幌市中央区”,”大通東”,0,0,1,0,0,0
01101,”060 “,”0600042″,”ホッカイドウ”,”サッポロシチュウオウク”,”オオドオリニシ(1-19チョウメ)”,”北海道”,”札幌市中央区”,”大通西(1~19丁目)”,1,0,1,0,0,0
01101,”064 “,”0640820″,”ホッカイドウ”,”サッポロシチュウオウク”,”オオドオリニシ(20-28チョウメ)”,”北海道”,”札幌市中央区”,”大通西(20~28丁目)”,1,0,1,0,0,0
01101,”060 “,”0600031″,”ホッカイドウ”,”サッポロシチュウオウク”,”キタ1ジョウヒガシ”,”北海道”,”札幌市中央区”,”北一条東”,0,0,1,0,0,0
01101,”060 “,”0600001″,”ホッカイドウ”,”サッポロシチュウオウク”,”キタ1ジョウニシ(1-19チョウメ)”,”北海道”,”札幌市中央区”,”北一条西(1~19丁目)”,1,0,1,0,0,0
01101,”064 “,”0640821″,”ホッカイドウ”,”サッポロシチュウオウク”,”キタ1ジョウニシ(20-28チョウメ)”,”北海道”,”札幌市中央区”,”北一条西(20~28丁目)”,1,0,1,0,0,0
nkfかエディタの機能を使って文字コードをUTF-8に変換し、半角カナを全角に直しておきます。
MySQLに郵便番号用テーブルを用意する
ここの説明を読むと
- JISコード(5桁) 半角数字
- 旧郵便番号(5桁) 半角数字
- 郵便番号(7桁) 半角数字
- 都道府県名 半角カナ
- 市区町村名 半角カナ
- 町域名 半角カナ
- 都道府県名 漢字
- 市区町村名 漢字
- 町域名 漢字
- 一町域が二以上の郵便番号で表される場合の表示(1,0)
- 小字毎に番地が起番されている町域の表示(1,0)
- 丁目を有する町域の場合の表示(1,0)
- 一つの郵便番号で二以上の町域を表す場合の表示(1,0)
- 更新の表示(「0」は変更なし、「1」は変更あり、「2」廃止)
- 変更理由 (0~6)
これを元にテーブルを設計していきます。主キーをJISコードか郵便番号に設定したいのですが、どちらも重複しているので主キーはなしで設定します。
そのままではSELECTしたときに速度が遅いので、郵便番号7桁と市区町村名にインデックスを張っておきます。
CREATE TABLE `m_zip` ( `jis` char(5) NOT NULL DEFAULT '', `zip_old` char(5) NOT NULL DEFAULT '', `zip` char(7) NOT NULL DEFAULT '', `pref_kana` varchar(20) DEFAULT NULL, `city_kana` varchar(100) DEFAULT NULL, `town_kana` varchar(200) DEFAULT NULL, `pref` varchar(20) COLLATE utf8_bin DEFAULT NULL, `city` varchar(100) DEFAULT NULL, `town` varchar(200) DEFAULT NULL, `flg1` tinyint(1) DEFAULT NULL, `flg2` tinyint(1) DEFAULT NULL, `flg3` tinyint(1) DEFAULT NULL, `flg4` tinyint(1) DEFAULT NULL, `flg5` tinyint(1) DEFAULT NULL, `flg6` tinyint(1) DEFAULT NULL, KEY `zip` (`zip`), KEY `town` (`town`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin
テーブルに郵便番号データを流し込む
LOAD DATA LOCAL INFILE '/path/KEN_ALL.CSV' INTO TABLE `m_zip` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
これをサーバー上で実行すればインポート完了です。