Então essa será a pergunta fictícia do ano, mas eu preciso perguntar já que não é a primeira vez que passo por isso. Dê uma olhada na seguinte definição de tabela:
Dê uma olhada na coluna from_number
que é VARCHAR(45)
agora, mas conterá um número de telefone. Como não sei quantos números um telefone pode 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, então acho que VARCHAR
não é um tipo adequado para armazenar esse tipo de informação - talvez eu esteja errado, você me diz - então estou pensando em mudar para INT
ou mesmo BIGINT
.
Quando estou definindo 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 fazer. Então, se eu fizer isso: BIGINT()
recebi este erro:
O que me orienta a ler um pouco sobre esse tipo de MySQL aqui . Basicamente a informação é esta:
Um grande número inteiro. ... O intervalo não assinado é de 0 a 18446744073709551615.
O que me faz perguntar: qual valor devo definir para parênteses quando estou definindo um BIGINT()
tipo. (Estou usando o BIGINT porque não sei se o INT pode conter tantos números quanto um telefone poderia ter - talvez eu também esteja errado). Qual é a maneira correta de criar|projetar uma coluna em bancos de dados MariaDB/MySQL?
De qualquer forma 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 ER. Estou usando também MariaDB 10.0.x
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; então da América do Norte, o sistema reconhece automaticamente "011" na frente de chamadas internacionais, etc.
Além disso, e os números de telefone como "1-800-DBA-HELP"?
Eu normalmente armazenaria números de telefone como texto. Dito isto, realmente depende de quão crítica é sua coluna de número de telefone. Se você estiver executando discadores automatizados dessa coluna, você realmente deseja garantir que apenas os números sejam incluídos e 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 forneci.
Anteriormente estava escrito:
"Com MariaDB você pode usar um
computed
campo para extrair apenas os dígitos para um discador automático. Também funciona para MySQL 5.7."Em resposta à pergunta do OP sobre isso ("você pode explicar um pouco o que você está me dizendo?"), aqui está uma explicação.
Muitos sistemas de banco de dados já introduziram esse recurso. Estes são campos que são conhecidos como "
computed
", "virtual
" ou "generated
" que são derivados de valores em outros campos. O poder deste recurso irá variar dependendo do 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 ter uma coluna computada que "armazena" (lembre-se, elas podem ser virtuais - ou seja, calculadas em tempo real, ou podem ser armazenadas fisicamente em disco) o sobrenome em letras maiúsculas, tornando assim pesquisa mais fácil. Dessa forma, você só precisa pesquisar em
CAP
s (usando, digamos,LIKE
), sabendo que os dados que estão sendo pesquisados no [computed
|virtual
|generated
] campo está em texto em maiúsculas.O conceito do MySQL 5.7 é explicado aqui e aqui . Está no MariaDB há um pouco mais de tempo e o conceito também é explicado aqui . Alguns usos possíveis são sugeridos aqui , mas você está realmente limitado apenas pela sua imaginação. Eles podem ser vistos como um substituto conveniente (e menos propenso a erros) para 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.
Hum. Os números de telefone são feitos de números. Usar varchar permite que o usuário armazene qualquer tipo de formatação, com ( ou não, com - ou . e cria rapidamente uma confusão com seus dados. Um formato de telefone # depende do "país", a máscara deve ser vinculada ao país. Extensão é uma extensão e é opcional, então deve ser armazenado em um "campo de extensão". (int também). Para 1-800-DBA-HELP, eu converteria isso rapidamente e armazenaria o número real. Se você realmente precisar deles telefone legível por humanos #, armazene-o em um campo varchar separado.
Eu costumo armazenar os números de telefone em texto simples . A formatação e a exibição deixam para o código do cliente.
Aqui, mais do que, como você armazena? o que você vai fazer com esse número de telefone é muito importante.
Se sua empresa deseja realizar chamadas de saída do seu sistema, o aplicativo extrairá apenas números. Se sua empresa quiser fazer chamadas internacionais , armazene o código do país e o código de área em colunas separadas.
Caso sua empresa deseje relatórios , o aplicativo irá formatar e exibir com extensão e números separadamente.
Do meu entendimento, projetar um modelo de dados universal para número de telefone não é uma boa ideia. Cada país tem diferentes números, ramais e código de área além do código do país. Além disso, fiquei sabendo que alguns países não têm código de área.
Isso pode não responder à sua pergunta, mas ajudará a ampliar nossa compreensão. Obrigada.