Tipo de dados para o número de telefone: VARCHAR, INT ou BIGINT?

12

Portanto, esta será a pergunta fictícia do ano, mas preciso perguntar, já que não é a primeira vez que passo por isso. Dê uma olhada na seguinte definição de tabela:

insira a descrição da imagem aqui

Dê uma olhada na coluna from_numberque está VARCHAR(45)no momento, mas ela conterá um número de telefone. Como não sei quantos números um telefone poderia ter em todo o mundo, estou tentando cobrir quase todos eles. Eu quero manter a integridade do banco de dados o máximo possível, para que eu VARCHARnão seja o tipo adequado para armazenar esse tipo de informação - talvez eu esteja errado, você me diz -, então estou pensando em mudar para INTou mesmo BIGINT.

Ao definir uma coluna no Workbench, devo especificar o número entre parênteses, ()não em todos os casos, mas naqueles que mencionei anteriormente, tive que fazê-lo. Então, se eu fizer isso: BIGINT()recebi este erro:

insira a descrição da imagem aqui

O que me guia a ler um pouco sobre esse tipo de MySQL aqui . Basicamente, a informação é esta:

Um número inteiro grande. ... O intervalo não assinado é de 0 a 18446744073709551615.

O que me faz perguntar: que valor devo definir entre parênteses ao definir um BIGINT()tipo. (Estou usando o BIGINT porque não sei se o INT pode armazenar tantos números quanto um telefone - talvez eu esteja errado também). Qual é a maneira correta de criar uma coluna nos bancos de dados MariaDB / MySQL?

Enfim, gostaria de saber sua opinião, experiência e, é claro, gostaria de obter uma resposta

Nota: Estou usando a última edição do MySQL Workbench para criar o diagrama de ER. Também estou usando o MariaDB 10.0.x

ReynierPM
fonte

Respostas:

13

Como você lidaria com um número de telefone com um ramal, como "+ 1-000-000-0000 ext 1234"?

Observe que o "+" indica que as regras de discagem internacional devem ser aplicadas; portanto, na América do Norte, o sistema conhece automaticamente "011" na frente de chamadas internacionais etc.

Além disso, e os números de telefone como "1-800-DBA-HELP"?

Normalmente, eu armazenava números de telefone como texto. Dito isto, realmente depende da importância da sua coluna de número de telefone. Se você estiver executando discadores automáticos a partir dessa coluna, realmente desejará garantir que apenas números sejam incluídos e que os dados representem números de telefone bem formados.

Você pode ter colunas separadas para ramais e números de telefone com texto, como o exemplo "1-800-DBA-HELP" que eu forneci.

Max Vernon
fonte
Sim, eles serão críticos, por isso não cometerei nenhum erro no futuro, com base no fato de eu permitir apenas números. Qual é a sua sugestão? É fácil adicionar uma nova coluna que mantenha o número do ramal ou eu quero fazer as pessoas entrar números como 1-800-DBA-HELPpor ele é dígitos
ReynierPM
Realmente depende de suas necessidades. Se você precisar manter a capacidade de reconhecimento humano, eu certamente gostaria de manter os números baseados em texto em algum lugar, provavelmente em um campo de texto. Se você não se importa com a parte do texto, não as armazene.
Max Vernon
1
O INT certamente não é grande o suficiente se você armazenar o número completo com o código do país. BIGINT é provavelmente grande o suficiente.
Max Vernon
1
Eu quero pelo menos 20 dígitos.
Max Vernon
1
Com o MariaDB, você pode usar um campo computado para extrair apenas os dígitos de um discador automático. Talvez no MySQL 5.7 (não tenho certeza).
Vérace
2

Anteriormente, foi escrito:

"Com o MariaDB, você pode usar um computedcampo para extrair apenas os dígitos de um discador automático. Também funciona para o MySQL 5.7."

Em resposta à pergunta do OP sobre isso ("você pode explicar um pouco o que está me dizendo?"), Aqui está uma explicação.

Muitos sistemas de banco de dados já introduziram esse recurso. Esses são campos conhecidos de várias formas " computed", " virtual" ou " generated", derivados de valores em outros campos. A potência desse recurso varia de acordo com o seu RDBMS. Eu sei que Oracle, Firebird, MariaDB e agora MySQL 5.7 os têm. Outros provavelmente também o fazem.

Um exemplo fácil seria ter uma coluna de sobrenome e uma coluna computada que "armazene" (lembre-se, elas podem ser virtuais - isto é, calculadas dinamicamente ou podem ser fisicamente armazenadas em disco) - o sobrenome como todas as maiúsculas pesquisando mais fácil. Dessa forma, você só precisa pesquisar em CAPs (usando, digamos, LIKE), sabendo que os dados sendo pesquisados ​​no [ computed| virtual| generated] está em texto maiúsculo.

O conceito para o MySQL 5.7 é explicado aqui e aqui . Ele está no MariaDB há um pouco mais e o conceito também é explicado aqui . Alguns usos possíveis são sugeridos aqui , mas você é realmente limitado apenas pela sua imaginação. Eles podem ser vistos como um substituto conveniente (e menos propenso a erros) aos gatilhos.

Para o seu caso de uso específico, você pode derivar um número discável de um campo de texto "+" -> "00" (ou qualquer que seja o seu código de discagem internacional). Apenas um pensamento.

Vérace
fonte
Ótimo, você pode melhorar um pouco sua pergunta adicionando algumas consultas? Quer dizer, eu tenho o conceito, mas não estou certo de como criar o virtualou generatedvalores. Estou pensando em usoCONCAT ou em outra coisa, mas não tenho certeza. Além disso, você menciona uma pesquisa CAPSusando. LIKEVocê também pode dar um exemplo disso? E o desempenho das colunas calculadas em tempo real ( virtual) vs persisted (geradas)?
ReynierPM
1

Hmm. Os números de telefone são feitos de números. O uso do varchar permite ao usuário armazenar qualquer tipo de formatação, com (ou não, com - ou. E cria rapidamente uma confusão com seus dados. Um formato de número de telefone é dependente do "país", a máscara deve estar ligada ao país. é uma extensão e é opcional, por isso deve ser armazenada em um "campo de extensão". (int também). Para o 1-800-DBA-HELP, eu o converteria instantaneamente e armazenaria o número real. número de telefone legível por humanos, armazene-o em um campo varchar separado.

greenlitmysql
fonte
1

Eu costumo armazenar os números de telefone em texto simples . Formatação e exibição deixam para o código do cliente.

Aqui, mais do que, como você armazena? o que você fará com esse número de telefone é realmente importante.

Se sua empresa deseja realizar chamadas de saída do seu sistema, o aplicativo extrairá apenas números. Se sua empresa deseja fazer chamadas internacionais , armazene o código do país e o código de área em colunas separadas.

Se sua empresa deseja gerar relatórios , o aplicativo será formatado e exibido com ramal e números separadamente.

Do meu entendimento, projetar modelo de dados universal para número de telefone não é uma boa ideia. Cada país possui números, extensões e códigos de área diferentes, além do código do país. Além disso, soube que alguns países não possuem código de área.

Isso pode não responder à sua pergunta, mas ajudará a ampliar nosso entendimento. Obrigado.

rathishDBA
fonte