Pergunta

Eu quero o número de telefone de entrada em um formulário, incluindo o código do país, extensão

create table if not exists employee(    `   
      country_code_tel   int(11),
      tel_number         int(10),
      extension          int(10),
      mobile             bigint(20)
);

Se tel_number é maior do que 15 bits, que tipo de dados posso usar, é melhor eu uso Bigint(20)?

create table address(
      address           varchar(255),  
      city              varchar(255),
      country           varchar(255),
      post_code         int(11)
);

Por exemplo, se eu tiver um código de país para o Canadá eu posso usar dois ou 002. O que é melhor para o processamento?

Obrigado por seu conselho.

Foi útil?

Solução

Bem, pessoalmente, eu não uso tipo de dados numérico para armazenar números de telefone ou informações relacionadas.

Como você armazenar um número digamos 001234567? Ele vai acabar como 1234567, perdendo os zeros à esquerda.

Claro que você pode sempre deixou-pad-lo, mas isso é desde que você saiba exatamente quantos dígitos o número deve ser.

Este não atender todo o seu post,
Apenas meus 2 centavos

Outras dicas

Na verdade, você pode usar um varchar para um número de telefone. Você não precisa de um int porque você não está indo para executar a aritmética sobre os números.

armazená-los como dois campos para números de telefone - um "número" e uma "máscara" como tipos TinyText que não precisam mais de 255 itens

.

Antes de armazenar os arquivos que analisar o número de telefone para obter a formatação que tem sido utilizado e que cria a máscara, que, em seguida, guardar o número um apenas dígitos por exemplo.

Entrada: (0123) 456 7890
Número: 01234567890
Máscara: (nnnn)_nnn_nnnn

Teoricamente, isso nos permite realizar pesquisas de comparação no campo de número, tais como a obtenção de todos os números de telefone que começam com um código de área específica, sem ter que se preocupar como ele foi introduzido pelos usuários

Eu costumo guardar números de telefone como um BIGINT em formato E164.

E164 nunca começa com um 0, com os primeiros dígitos sendo o código do país.

+441234567890
+44 (0)1234 567890
01234 567890

etc. seria armazenado como 441234567890.

Gostaria de usar um varchar para números de telefone. Dessa forma, você também pode armazenar + e (), que às vezes é visto em números Tel (como você mencionou a si mesmo). e você não precisa se preocupar sobre como utilizar-se todos os bits em números inteiros.

Eu não tenho certeza se é uma boa idéia para usar inteiros em tudo. Alguns números pode conter caracteres especiais (#, como parte da extensão, por exemplo) que você deve ser capaz de lidar também. Assim, gostaria de sugerir o uso de VARCHARs vez.

Se o armazenamento de menos de 1 registros mil, e alto desempenho não é um problema para ir varchar (20) / char (20), caso contrário eu descobri que para armazenar até 100 milion telefones comerciais globais ou telefones pessoais, int é melhor . Motivo:. Chave menor -> maior velocidade de leitura / gravação, também a formatação pode permitir duplicatas

um telefone no CHAR (20) = 20 bytes vs 8 bytes bigint (ou 10 vs 4 bytes int para telefones locais, até 9 dígitos), menos entradas podem entrar no bloco de índice => mais blocos => mais pesquisas, consulte este para mais informações (escrito para o MySQL mas deve ser verdade para outros bancos de dados relacionais).

Aqui está um exemplo de tabelas de telefone:

CREATE TABLE `phoneNrs` (   
    `internationalTelNr` bigint(20) unsigned NOT NULL COMMENT 'full number, no leading 00 or +, up to 19 digits, E164 format',
    `format` varchar(40) NOT NULL COMMENT 'ex: (+NN) NNN NNN NNN, optional',
    PRIMARY KEY (`internationalTelNr`)
    )
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin

ou com o processamento de / desdobramento antes de inserção (2 + 2 + 4 + 1 = 9 bytes)

CREATE TABLE `phoneNrs` (   
    `countryPrefix` SMALLINT unsigned NOT NULL COMMENT 'countryCode with no leading 00 or +, up to 4 digits',
    `countyPrefix` SMALLINT unsigned NOT NULL COMMENT 'countyCode with no leading 0, could be missing for short number format, up to 4 digits',
    `localTelNr` int unsigned NOT NULL COMMENT 'local number, up to 9 digits',
    `localLeadingZeros` tinyint unsigned NOT NULL COMMENT 'used to reconstruct leading 0, IF(localLeadingZeros>0;LPAD(localTelNr,localLeadingZeros+LENGTH(localTelNr),'0');localTelNr)',
    PRIMARY KEY (`countryPrefix`,`countyPrefix`,`localLeadingZeros`,`localTelNr`)  -- ordered for fast inserts
) 
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin
;

Além disso "o número de telefone não é um número", na minha opinião é relativo ao tipo de números de telefone. Se estamos falando de uma lista telefónica móvel interno, então cordas estão bem, como o usuário pode desejar armazenar Códigos GSM Hash . Se armazenamento E164 telefones, bigint é a melhor opção.

Considere normalizando a E.164 formato. Para apoio internacional completo, você precisa de um VARCHAR de 15 dígitos.

Veja recomendação do Twilio para mais informações sobre a localização de números de telefone.

INT (10) não significar uma série de 10 dígitos, que significa um número inteiro com uma largura de 10 dígitos visor. O valor máximo para um INT no MySQL é 2147483647 (ou 4294967295, se não assinado).

Você pode usar um BIGINT em vez de INT para armazená-lo como um numérico. utilização BIGINT você vai economizar 3 bytes por linha ao longo VARCHAR (10).

Para Store "País + área + número separadamente". Você pode tentar usar um VARCHAR (20), isto permite-lhe a capacidade para armazenar números de telefone internacionais corretamente, deve que precisa surgir.

varchar ou o texto deve ser os melhores tipos de dados para armazenar números de telefone móvel, eu acho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top