郵便番号をMySQLへインポートする方法

全国郵便番号データをMySQLへインポートする方法です。一度やってしまうと1年くらいはほったらかし状態のため、毎回やり方を模索しながらインポートしているので備忘録代わりです。

郵便番号データを用意する

まずは郵便局のホームページからCSVデータをダウンロードしてきます。
読み仮名データの促音・拗音を小書きで表記するもの – 日本郵便

image

標準ではlzhファイルのダウンロードとなっているので、「zip形式でのダウンロード」をクリックするとダウンロードリンクzipファイルに変わります。

全国一括をダウンロードします。image

ダウンロードファイルを解凍すると「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 '"'

これをサーバー上で実行すればインポート完了です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA