Mọi developer đã xây dựng form địa chỉ cho khách hàng châu Âu cuối cùng đều khám phá ra sự thật: không có định dạng mã bưu chính châu Âu thống nhất. Mỗi quốc gia có định dạng riêng, và các biến thể thực sự có ý nghĩa. Trang này là tài liệu tham khảo từng quốc gia bao gồm EU-27 cộng các quốc gia châu Âu ngoài EU quan trọng, với các regex pattern và mẹo validation bạn cần trong production.
Pattern Tổng Quan
Mã bưu chính châu Âu chia thành khoảng bốn nhóm:
- 5 chữ số: Đức, Pháp, Ý, Tây Ban Nha, Phần Lan, Croatia, Estonia, Hy Lạp, Lithuania, Slovakia.
- 4 chữ số: Bỉ, Bulgaria, Hungary, Áo, Thụy Sĩ, Liechtenstein, Luxembourg, Na Uy, Slovenia, Đan Mạch.
- Chữ-số, định dạng cố định: Hà Lan (4 chữ số cộng 2 chữ cái), Ireland (Eircode, 7 ký tự chữ-số), Malta (3 chữ cái cộng 4 chữ số).
- Chữ-số phân cấp: Vương quốc Anh (độ dài thay đổi, hai phần).
Cộng thêm một số trường hợp ngoại lệ: Thụy Điển dùng 5 chữ số với khoảng trắng sau chữ số thứ ba (123 45), Ba Lan dùng 5 chữ số với dấu gạch ngang sau chữ số thứ hai (00-001), Czechia dùng 5 chữ số với khoảng trắng sau chữ số thứ ba (110 00).
Tài Liệu Tham Khảo EU-27
| Quốc gia | ISO | Định dạng | Ví dụ | Regex |
|---|---|---|---|---|
| Áo | AT | 4 chữ số | 1010 | ^\d{4}$ |
| Bỉ | BE | 4 chữ số | 1000 | ^\d{4}$ |
| Bulgaria | BG | 4 chữ số | 1000 | ^\d{4}$ |
| Croatia | HR | 5 chữ số | 10000 | ^\d{5}$ |
| Síp | CY | 4 chữ số | 1010 | ^\d{4}$ |
| Czechia | CZ | NNN NN | 110 00 | ^\d{3} ?\d{2}$ |
| Đan Mạch | DK | 4 chữ số | 1050 | ^\d{4}$ |
| Estonia | EE | 5 chữ số | 10111 | ^\d{5}$ |
| Phần Lan | FI | 5 chữ số | 00100 | ^\d{5}$ |
| Pháp | FR | 5 chữ số | 75008 | ^\d{5}$ |
| Đức | DE | 5 chữ số | 10115 | ^\d{5}$ |
| Hy Lạp | GR | NNN NN | 105 63 | ^\d{3} ?\d{2}$ |
| Hungary | HU | 4 chữ số | 1051 | ^\d{4}$ |
| Ireland | IE | Eircode | D02 X285 | ^[A-Z]\d{2} ?[A-Z0-9]{4}$ |
| Ý | IT | 5 chữ số | 00184 | ^\d{5}$ |
| Latvia | LV | LV-NNNN | LV-1050 | ^LV-\d{4}$ |
| Lithuania | LT | LT-NNNNN | LT-01100 | ^LT-\d{5}$ |
| Luxembourg | LU | 4 chữ số | 1234 | ^\d{4}$ |
| Malta | MT | LLL NNNN | VLT 1234 | ^[A-Z]{3} ?\d{4}$ |
| Hà Lan | NL | NNNN LL | 1011 AB | ^\d{4} ?[A-Z]{2}$ |
| Ba Lan | PL | NN-NNN | 00-001 | ^\d{2}-\d{3}$ |
| Bồ Đào Nha | PT | NNNN-NNN | 1000-001 | ^\d{4}-\d{3}$ |
| Romania | RO | 6 chữ số | 010001 | ^\d{6}$ |
| Slovakia | SK | NNN NN | 811 01 | ^\d{3} ?\d{2}$ |
| Slovenia | SI | 4 chữ số | 1000 | ^\d{4}$ |
| Tây Ban Nha | ES | 5 chữ số | 28013 | ^\d{5}$ |
| Thụy Điển | SE | NNN NN | 111 22 | ^\d{3} ?\d{2}$ |
Các Quốc Gia Châu Âu Ngoài EU Quan Trọng
| Quốc gia | ISO | Định dạng | Ví dụ | Regex |
|---|---|---|---|---|
| Vương quốc Anh | GB | phân cấp | SW1A 1AA | ^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$ |
| Thụy Sĩ | CH | 4 chữ số | 8001 | ^\d{4}$ |
| Na Uy | NO | 4 chữ số | 0150 | ^\d{4}$ |
| Iceland | IS | 3 chữ số | 101 | ^\d{3}$ |
| Liechtenstein | LI | 4 chữ số | 9490 | ^\d{4}$ |
Mã Bưu Chính UK Chi Tiết
Hệ thống UK là hệ thống chứa nhiều thông tin nhất ở châu Âu. Mã như SW1A 1AA phân tách thành:
SW: khu bưu chính (London South West)SW1A: quận bưu chính (St James's và Pimlico)SW1A 1: khu vực bưu chính (một vài con phố)SW1A 1AA: đơn vị bưu chính (điểm giao hàng cụ thể, thường là một tòa nhà)
Sự phân cấp này có nghĩa là mã bưu chính UK có thể xác định một tòa nhà, đó là lý do tại sao các sản phẩm UK thường dùng mã bưu chính như proxy cho nhóm cấp khu phố hoặc thậm chí cấp đường phố. Hầu như không có hệ thống mã bưu chính nào của quốc gia khác làm được điều này.
Các Pattern Validation Trong Production
Cách tiếp cận production rẻ nhất là bảng regex theo từng quốc gia như trên, được áp dụng dựa trên mã quốc gia từ địa chỉ. Mã quốc gia có thể đến từ:
- Dropdown rõ ràng mà người dùng đã chọn
- IP geolocation của người dùng
- Kết quả geocoder (hầu hết geocoder production chuẩn hóa mã bưu chính và bao gồm mã quốc gia trong response)
Tránh cố gắng validate mã bưu chính mà không biết quốc gia. Mã 4 chữ số hợp lệ ở 12 quốc gia và không hợp lệ ở nhiều quốc gia khác.
Với các flow quan trọng (checkout, KYC, các ngành được quản lý), đừng dừng lại ở regex. Gửi địa chỉ đến geocoder và xem response với độ chính xác "rooftop" hoặc "street" như là validation, không chỉ dựa vào kết quả khớp regex. Mã bưu chính được định dạng đúng vẫn có thể không khớp với địa chỉ thực.
Lưu Trữ và Chuẩn Hóa
Lưu mã bưu chính dưới dạng string, không phải số. Số 0 đứng đầu quan trọng (01100 là mã Lithuania hợp lệ; 1100 thì không). Các quy ước định dạng lưu trữ:
- Bỏ các ký tự không phải chữ-số khi so sánh giữa các tập dữ liệu.
- Hiển thị theo dạng chuẩn của từng quốc gia (với dấu gạch ngang, khoảng trắng, prefix) khi output.
- Luôn lưu mã quốc gia cùng với mã bưu chính, ngay cả khi sản phẩm của bạn hiện chỉ hoạt động ở một quốc gia. Schema sẽ mở rộng ra đa quốc gia mà không cần migration.
MapAtlas Giúp Như Thế Nào
MapAtlas Geocoding API trả về field address_components.postal_code đã được chuẩn hóa cho mọi quốc gia được hỗ trợ, được validate với dữ liệu nguồn. Search API chấp nhận mã bưu chính như input tìm kiếm và trả về địa điểm khớp. Cả hai API đều được host tại EU, tuân thủ GDPR, và xây dựng trên dữ liệu chuẩn OSM với các parser địa chỉ theo từng quốc gia rõ ràng.
Để tìm hiểu sâu hơn về cách địa chỉ trở thành tọa độ, xem Geocode là gì. Để hiểu cơ học kinh độ và vĩ độ đứng sau mọi response tọa độ, xem Kinh độ và Vĩ độ.
Câu hỏi thường gặp
Định dạng mã bưu chính châu Âu như thế nào?
Không có định dạng mã bưu chính châu Âu thống nhất. Mỗi quốc gia định nghĩa định dạng riêng. Hầu hết dùng mã số có độ dài cố định (5 chữ số ở Đức, Pháp, Ý, Tây Ban Nha; 4 chữ số ở Bỉ, Hungary, Áo, Thụy Sĩ), nhưng một số dùng mã chữ-số (Hà Lan dùng 4 chữ số cộng 2 chữ cái, Vương quốc Anh dùng hệ thống chữ-số hai phần phức tạp, Ireland dùng Eircode với 7 ký tự chữ-số). Một address validator hoạt động phải chứa pattern theo từng quốc gia cho EU-27 cộng các quốc gia châu Âu ngoài EU quan trọng.
Mã bưu chính Đức (Postleitzahl) có giống mã bưu chính Ba Lan không?
Cả hai đều có năm ký tự nhưng cấu trúc khác nhau. Đức dùng 5 chữ số liên tiếp (ví dụ 10115). Ba Lan dùng 2 chữ số, dấu gạch ngang, rồi 3 chữ số (ví dụ 00-001). Để lưu trữ, bạn có thể giữ dạng chuẩn có dấu gạch ngang cho Ba Lan và không có cho Đức. Để khớp giữa các tập dữ liệu, chuẩn hóa bằng cách bỏ các ký tự không phải chữ-số và áp dụng lại định dạng theo từng quốc gia khi hiển thị.
Làm thế nào để validate mã bưu chính từ bất kỳ quốc gia EU nào?
Đầu tiên xác định quốc gia (từ địa chỉ, mã quốc gia ISO 3166-1 alpha-2, hoặc geolocation của người dùng). Sau đó áp dụng regex pattern của quốc gia đó. Validation theo từng quốc gia là pattern production tiêu chuẩn, vì một regex toàn cầu duy nhất sẽ hoặc là từ chối các mã hợp lệ hoặc chấp nhận các mã rõ ràng là không hợp lệ. MapAtlas Geocoding API trả về mã bưu chính đã chuẩn hóa theo từng quốc gia trong `address_components`, vì vậy thường bạn để geocoder làm bước validation cho bạn.
Tại sao hệ thống mã bưu chính Vương quốc Anh trông khác biệt như vậy?
Mã bưu chính UK dùng hệ thống chữ-số phân cấp mã hóa khu bưu chính, quận, khu vực và đơn vị trong hai phần (ví dụ SW1A 1AA cho Điện Buckingham). Nó chứa nhiều thông tin không gian hơn trên mỗi mã so với hầu hết hệ thống của các quốc gia, đó là lý do tại sao mã bưu chính UK đôi khi được dùng như proxy cho khu phố hoặc thậm chí từng con phố. Hệ thống được thiết kế vào những năm 1950 và 1960 và đã được điều chỉnh vào hạ tầng dữ liệu hiện đại kể từ đó.

