👳‍♂️

郵便番号から都道府県は一意に特定できない罠をご存知か

に公開
2024/03/14
1件

はじめに

郵便番号とは、当たり前に都道府県・市区町村が特定できるものだと、
そのための識別コードが郵便番号である、とすら思い込んでいました。

そんな思い込みのもと、郵便番号から都道府県を割り出すコードを書き終わってから、
「複数の都道府県にまたがる郵便番号」の存在に気付いた人がここにいたので、備忘録です。

やりたかったこと

郵便番号から都道府県を割り出したい

ユーザが47都道府県を、任意にグループ分けできる機能がある。
注文の送り先都道府県がどのグループに属するかを判定したい。
しかし住所はユーザ自由入力のため表記揺れが激しく、できれば見たくない。
そこで郵便番号から都道府県を割り出すことにした。

実際に書いた処理

郵便番号から都道府県を特定するgetPrefectureFromPostalCode()を定義し、
ユーザ入力の郵便番号が正しいかどうかで条件分岐させた。

  • 郵便番号が正しい場合
    1. getPrefectureFromPostalCode()を呼ぶ
  • 郵便番号が不正な場合(存在しない郵便番号や空)
    1. 住所から郵便番号を特定する
    2. 郵便番号が特定できれば、getPrefectureFromPostalCode()を呼ぶ
    3. 不正な住所などで特定できなければ、例外として処理する

しかし郵便番号から都道府県は一意に特定できない

そんな可能性は微塵も考えなかったため、「郵便番号 重複 都道府県」なんぞググらず実装完了。
レビューで指摘いただいてから、まさかそんなわけ...と思いつつ調べてみたところ、
複数の都道府県にまたがる郵便番号が存在することが発覚。なんでや!

複数の都道府県にまたがる郵便番号は、以下の3つ。

  • 〒498-0000
    愛知県 弥富市
    三重県 桑名郡木曽岬町

  • 〒618-0000
    京都府 乙訓郡大山崎町
    大阪府 三島郡島本町

  • 〒871-0000
    福岡県 築上郡吉富町
    大分県 中津市

市区町村をまたぐ郵便番号に至ってはもっとある。
例えば、〒950-0000は6の市区町村にまたがって重複する。

どう対処したか

結論

上記3つの「複数の都道府県にまたがる郵便番号」の扱いとして、"今回の仕様では"目を瞑って問題なしと判断した。具体的には、この郵便番号の場合は、厚生労働省が定める都道府県番号が小さい方の府県を採用する。

なぜか

というのも、そもそも郵便番号は「都道府県」「市区町村」「町域」の3要素の組み合わせと対応している。愛知県 弥富市を例に見るとこんな感じ。

郵便番号 都道府県 市区町村 町域
4901401 愛知県 弥富市 六條町
4901402 愛知県 弥富市 五斗山
4901403 愛知県 弥富市 鳥ケ地
4901404 愛知県 弥富市 桴場
4901405 愛知県 弥富市 神戸
⋮ 愛知県 弥富市 ⋮

このように、愛知県 弥富市だけで、「町域」が異なる郵便番号は104も存在する。
そして問題の三重県とまたがる郵便番号、4980000は「町域」に指定がないものである。

郵便番号 都道府県 市区町村 町域
4901401 愛知県 弥富市 六條町
4901402 愛知県 弥富市 五斗山
4901403 愛知県 弥富市 鳥ケ地
4901404 愛知県 弥富市 桴場
4901405 愛知県 弥富市 神戸
⋮ 愛知県 弥富市 ⋮
4980000 愛知県 弥富市 以下に掲載がない場合[1]

つまり、愛知県弥富市で、かつ104ある町域のどこにも該当しないごく限られた地域のみが、
三重県桑名郡木曽岬町とまたがる〒498-0000を持つのである。
そうそう発生しないと考えても良いだろう。
他の2つの郵便番号も同様に、複数の都道府県にまたがるのは「町域」に指定がないものだった。

実際に地図から該当地域の面積を計算したわけではないので断言はできないが、
少なくとも我々のケースにおいては、目を瞑っても問題ないほどには稀有であろうと判断した。

足掻いたこと

とはいえ、どうにかならないかと考えはした。
郵便番号を経由せず、住所からそのまま都道府県を抜き出せれば、もちろんそれが一番良い。
しかし住所はユーザが自由入力した文字列がそのまま入ってくるため、誤記や略記が少なくない。

それでも正規表現などで無理やり都道府県を割り出すことも技術的にはできようが、
前述の通り問題の郵便番号が入力される可能性の低さや、リリースまでの時間を鑑みた結果、
そこまでする旨味は少ないと判断したため、根本解決ではないが目を瞑った。

おわりに

今回我々は難を逃れましたが、正確な判定が必要な方は同じ轍を踏まぬよう、ぜひお気を付けて。

脚注
  1. 日本郵便の実際のデータでは、4980000が一番上に表示されるため"以下"。ここでは分かりやすくするため末尾に追加した。 ↩︎

NE株式会社の開発ブログ

Discussion

さくらいさくらい

2024/03/14 誤りがあったため修正しました。

誤)〒452-0961は、66の市区町村にまたがって重複する。
正)〒950-0000は、6の市区町村にまたがって重複する。

〒452-0961は、66の「町域」にまたがった重複でした。
ここでは「市区町村」にまたがる重複の例を提示したかったため、〒950-0000の例に修正しました。
ちなみに〒452-0961は、地域の合併・編入の歴史によって66まで増えたそうです。