Eu preciso armazenar códigos postais em um banco de dados. Qual deve ser o tamanho da coluna?

103

Espero que a coluna seja um VARCHAR2, em meu banco de dados Oracle.

CEPs dos EUA são 9.

O canadense tem 7 anos.

Estou pensando que 32 caracteres seria um limite superior razoável

o que estou perdendo?

[EDIT] TIL: 12 é uma resposta razoável à pergunta Obrigado a todos que contribuíram.

EvilTeach
fonte
Link útil, porém sua precisão pode estar um pouco errada. Por exemplo, ele lista os códigos postais australianos com 7 caracteres, quando na verdade são 4. Ref: en.wikipedia.org/wiki/Postcodes_in_Australia e a lista de códigos postais disponível em www1.auspost.com.au/postcodes .
rossp
re: meu comentário anterior - isso não significa que esta lista não seja útil como um guia. Presumindo que a lista contenha códigos postais mais longos, o comprimento mais longo é de 9 caracteres, portanto, 16 caracteres ou algo parecido deve dar a você bastante espaço para respirar.
rossp
A lista de países também é um pouco curta. Tenho certeza de que há mais países no planeta do que aqueles listados ...
Robert Koritnik
2
De acordo com en.wikipedia.org/wiki/List_of_postal_codes , o mais longo tem 12 caracteres, se você estiver armazenando o '-', senão 11
Neil McGuigan
@CMS: Você pode querer atualizar o link para esta página da wikipedia , parece ser mais detalhado.
Vajk Hermecz

Respostas:

51

Percorrendo a página de códigos postais da Wikipedia , 32 caracteres devem ser mais que suficientes. Eu diria que até 16 caracteres é bom.

strager
fonte
8
Bom link. Mesmo permitindo a pontuação no ZIP + 4 dos EUA, 10 caracteres seriam suficientes para qualquer país, pelo que eu sabia.
Jonathan Leffler
Com base neste link, da página vinculada acima, eu
escolheria
5
O Chile tem 7 caracteres. A página da web que você referenciou simplesmente mostra a variação de pontuação.
EvilTeach de
21

Como já levantado por @neil-mcguigan, a wikipedia tem uma página decente sobre o assunto. Com base nesses 12 caracteres deve fazê-lo: http://en.wikipedia.org/wiki/List_of_postal_codes

O artigo da Wikipedia lista ~ 254 países, o que é muito bom em relação à UPU (União Postal Universal), que tem 192 países membros.

Vajk Hermecz
fonte
2
Observe que Montserrat tem apenas 8 caracteres, 1110-1350 denota um intervalo. discoverymni.com/about-montserrat/montserrat-post-codes
Vajk Hermecz
Possivelmente a Wikipedia precisa de edição, já que o código postal de aparência semelhante para Malta tem um genérico como "AAA NNNN". Eu não me importaria de ter até 15 caracteres porque só poderia ser menos problemático mais tarde se tivéssemos que ajustar o comprimento da coluna, também com o uso correto dos tipos de dados, não deveria ter todos os 15 caracteres de qualquer maneira (possivelmente varchar ou nvarchar ou algo parecido?) .
Manohar Reddy Poreddy
12

Por que você declararia um tamanho de campo maior do que os dados reais que espera armazenar nele?

Se a versão inicial do seu aplicativo for compatível com endereços dos EUA e Canadá (o que estou deduzindo do fato de você chamar esses tamanhos em sua pergunta), declararei o campo como VARCHAR2 (9) (ou VARCHAR2 ( 10) se você pretende armazenar o hífen nos campos ZIP + 4). Mesmo olhando para as postagens que outras pessoas fizeram nos códigos postais de vários países, VARCHAR2 (9) ou VARCHAR2 (10) seria suficiente para a maioria, senão todos os outros países.

Abaixo da linha, você sempre pode ALTERAR a coluna para aumentar o comprimento, caso seja necessário. Mas geralmente é difícil evitar que alguém, em algum lugar, decida ser "criativo" e coloque 50 caracteres em um campo VARCHAR2 (50) por um motivo ou outro (ou seja, porque eles querem outra linha em uma etiqueta de envio). Você também tem que lidar com o teste dos casos limites (será que todo aplicativo que exibe um ZIP manipula 50 caracteres?). E com o fato de que quando os clientes estão recuperando dados do banco de dados, eles geralmente estão alocando memória com base no tamanho máximo dos dados que serão buscados, e não no comprimento real de uma determinada linha. Provavelmente não é um grande negócio neste caso específico, mas 40 bytes por linha podem ser um pedaço decente de RAM para algumas situações.

Como um aparte, você também pode considerar armazenar (pelo menos para endereços nos EUA) o código postal e a extensão +4 separadamente. Geralmente é útil ser capaz de gerar relatórios por região geográfica, e você pode querer frequentemente colocar tudo em um CEP em vez de dividi-lo pela extensão +4. Nesse ponto, é útil não ter que tentar SUBSTR out os primeiros 5 caracteres para o código postal.

Caverna Justin
fonte
4
Bem, supondo que estejamos codificando em algo bobo como Pro * C, ter o campo grande o suficiente para crescimento significa que o código não precisará ser alterado se o uso aumentar.
EvilTeach
Sim, dividir o código postal dos EUA em 5 e 4 dígitos pode fazer sentido, dependendo de como você planeja usá-lo. Por exemplo, se você estiver fazendo algum tipo de correspondência de endereço, convém comparar no CEP 5 primeiro e resolver situações ambíguas com o CEP 9. Também ajuda usar um código de país
EvilTeach
3

O que está faltando é um motivo pelo qual você precisa que o código postal seja tratado de maneira especial.

Se você realmente não precisa TRABALHAR com um código postal, sugiro que não se preocupe com isso. Por trabalho, quero dizer fazer um processamento especial em vez de apenas usar para imprimir etiquetas de endereço e assim por diante.

Simplesmente crie três ou quatro campos de endereço de VARCHAR2 (50) [por exemplo] e deixe o usuário inserir o que quiser.

Você realmente precisa agrupar seus pedidos ou transações por código postal? Acho que não, uma vez que diferentes países têm esquemas muito diferentes para esse campo.

paxdiablo
fonte
Concordo. Usando um campo VARCHAR2, a realidade é que, para um campo como o código postal, realmente não importa. Um pouco grande demais é melhor do que irritar um cliente porque ele não consegue inserir seus detalhes.
Toby Allen
E os varchars são úteis porque os bancos de dados (pelo menos o DB2) podem otimizar o armazenamento deles, para não desperdiçar espaço de armazenamento.
paxdiablo
1
pode-se notar que a classificação por país e código postal resultará em tarifas postais mais baratas em alguns lugares.
EvilTeach
10
Disgaree. Algum tempo depois, você decidirá que precisará validar os endereços em seu banco de dados (por exemplo, para corrigir erros tipográficos e de entrada de dados) e é aí que você encontrará o benefício de construir corretamente seu modelo de dados em vez de apenas enfiar tudo dentro baldes.
Gary Myers
1
@Pax Se você entregar a correspondência em massa para o Royal Mail, pré-selecionada pelo distrito principal (primeira letra / duas letras) do código postal, você poderá solicitar a entrega por MailSort, que é mais barato do que o correio normal de segunda classe. Esse é apenas um exemplo.
Richard Gadsden
3

Normalização? Os códigos postais podem ser usados ​​mais de uma vez e podem estar relacionados a nomes de ruas ou cidades. Tabela (s) separada (s).

Stephan Eggermont
fonte
Interessante. Um ponto de vista diferente simplesmente foi rejeitado, sem motivo. +1
EvilTeach
Um código postal normalmente fará referência a um quarteirão de um lado da rua. Para encontrar uma região mais ampla, você selecionaria a primeira metade do código postal. Ter essas informações em uma tabela separada realmente não ajudará em nada e seria mais complicado de manter.
RevNoah
4
@EvilTeach: Aposto que foi rejeitado porque está fora do assunto. Ele informa o tamanho que uma coluna deve ter para armazenar todos os códigos postais possíveis no mundo? Não.
wmax
2

Os códigos postais canadenses têm apenas 6 caracteres, na forma de letras e números (LNLNLN)

Tegbains
fonte
3
Os códigos postais canadenses têm um espaço em branco no meio "ANA NAN" Isso é 7 caracteres.
EvilTeach
1
Mas o espaço está sempre no meio, então você não precisa armazená-lo.
Graeme Perrow
1
O espaço não parece fazer parte dos dados: "Nota: os códigos postais canadenses são sempre formatados na mesma sequência: caractere alfabético / numeral / alfa / numeral / alfa / numeral (por exemplo, K1A0B1)." Isso é do site do Canada Post.
tegbains
2
Não acho que omitir o espaço tenha algo a ver com 'normalização'. É apenas um problema de exibição. Como travessões nos números das contas. Eu não o armazenaria e não confiaria nele para identificar os códigos postais canadenses em vez de um campo CountryCode (int) que pode ser indexado. Separar a camada de dados e apresentação é a maneira certa de fazer isso.
Sam
2
Os Correios do Canadá preferem o espaço no código postal ao endereçar envelopes. É melhor armazená-lo com o espaço e lidar com a validação na entrada.
RevNoah
2

O Reino Unido publicou padrões: Catálogo de padrões de dados do governo do Reino Unido

Max 35 characters per line 

Endereço Postal Internacional:

Minimum of 2 lines and maximum of 5 lines for the postal delivery point 
details, plus 1 line for country and 1 line for postcode/zip code 

O comprimento do código postal do Reino Unido é:

Minimum 6 and Maximum 8 characters 
PodTech.io
fonte
1

Se você deseja integrar os códigos postais no banco de dados, é melhor usar o banco de dados de nomes geográficos. Embora seja difícil de usar e entender, é o maior banco de dados geográfico disponível gratuitamente para usuários como nós.

Todos os outros bancos de dados têm mais ou menos probabilidade de ter os mesmos dados e estrutura. Eles apenas removem algumas informações extras / redundantes do banco de dados. Se você está fazendo isso apenas para sistemas de baixa carga, use seus serviços gratuitos, os limites são atraentes e fornecem uma interface mais fácil usando json e ajax. Você pode ver os limites aqui

Para sua informação, varchar (20) é suficiente para armazenar códigos postais

Jay Kapasi
fonte