Tipo di dati per il numero di telefono: VARCHAR, INT o BIGINT?


12

Quindi questa sarà la domanda fittizia dell'anno, ma devo fare una domanda poiché non è la prima volta che la passo. Dai un'occhiata alla seguente definizione di tabella:

inserisci qui la descrizione dell'immagine

Dai un'occhiata alla colonna from_numberche è in VARCHAR(45)questo momento ma conterrà un numero di telefono. Dal momento che non so quanti numeri un telefono potrebbe avere in tutto il mondo, allora sto cercando di coprire quasi tutti. Voglio mantenere il più possibile l'integrità del database, quindi penso che VARCHARnon sia un tipo appropriato per contenere questo tipo di informazioni - forse mi sbaglio, mi dici - quindi sto pensando di cambiare INTo addirittura BIGINT.

Quando definisco una colonna in Workbench dovrei specificare il numero tra parentesi ()non in tutti i casi, ma in quelli che menziono in precedenza dovevo. Quindi se lo faccio: BIGINT()ho questo errore:

inserisci qui la descrizione dell'immagine

Il che mi guida a leggere un po 'su questo tipo di MySQL qui . Fondamentalmente le informazioni sono queste:

Un numero intero grande. ... L'intervallo senza segno è compreso tra 0 e 18446744073709551615.

Il che mi fa chiedere: quale valore devo impostare per le parentesi quando definisco un BIGINT()tipo. (Sto usando BIGINT perché non so se INT può contenere tutti i numeri che un telefono potrebbe avere - forse sbaglio anch'io). Qual è il modo giusto per creare | progettare una colonna nei database MariaDB / MySQL?

Vorrei comunque conoscere la tua opinione, la tua esperienza e ovviamente vorrei ricevere una risposta

Nota: sto usando MySQL Workbench ultima edizione per creare il diagramma ER. Sto usando anche MariaDB 10.0.x


Risposte:


13

Come gestiresti un numero di telefono con un interno, ad esempio "+ 1-000-000-0000 ext 1234"?

Si noti che il "+" indica che devono essere applicate le regole di composizione internazionali; quindi dal Nord America, il sistema conosce automaticamente "011" di fronte alle chiamate internazionali, ecc.

Inoltre, che dire dei numeri di telefono come "1-800-DBA-HELP"?

Solitamente memorizzerei i numeri di telefono come testo. Detto questo, dipende davvero da quanto sia importante la colonna del tuo numero di telefono. Se stai eseguendo dialer automatici da quella colonna, allora dovresti davvero assicurarti che siano inclusi solo i numeri e che i dati rappresentino numeri di telefono ben formati.

Potresti avere colonne separate per interni e numeri di telefono con testo, come nell'esempio "1-800-DBA-HELP" che ho fornito.


Sì, saranno fondamentali, quindi non commetterò alcun errore in futuro, in base al fatto che consentirei solo numeri, qual è il tuo suggerimento? È facile aggiungere una nuova colonna che contenga il numero di interno o voglio fare in modo che le persone inseriscano i numeri in 1-800-DBA-HELPbase alle cifre
ReynierPM

Dipende davvero dalle tue esigenze. Se hai bisogno di mantenere la riconoscibilità umana, vorrei certamente conservare i numeri basati sul testo da qualche parte, probabilmente in un campo di testo. Se non ti interessa la parte di testo, non memorizzarli.
Max Vernon,

1
INT non è certamente abbastanza grande se si memorizza il numero completo con il prefisso internazionale. BIGINT è probabilmente abbastanza grande.
Max Vernon,

1
Vorrei almeno 20 cifre.
Max Vernon,

1
Con MariaDB è possibile utilizzare un campo calcolato per estrarre solo le cifre di un dialer automatico. Forse in MySQL 5.7 (non sono sicuro).
Vérace,

2

In precedenza era stato scritto:

"Con MariaDB è possibile utilizzare un computedcampo per estrarre solo le cifre di un dialer automatico. Funziona anche con MySQL 5.7."

In risposta alla domanda del PO su questo ("puoi spiegare un po 'cosa mi stai dicendo?"), Ecco una spiegazione.

Molti sistemi di database hanno ora introdotto questa funzione. Questi sono campi che sono noti in modo diverso come " computed", " virtual" o " generated" che sono derivati ​​da valori in altri campi. La potenza di questa funzione varia in base al tuo RDBMS. So che Oracle, Firebird, MariaDB e ora MySQL 5.7 li hanno. Anche altri probabilmente lo fanno.

Un semplice esempio potrebbe essere avere una colonna di cognome e avere una colonna calcolata che "memorizza" (ricorda, possono essere virtuali - cioè calcolati al volo, o possono essere fisicamente memorizzati su disco) il cognome come tutti i capitali, rendendo così ricerca più semplice. In questo modo devi solo cercare su CAPs (usando, diciamo, LIKE), sapendo che i dati da cercare in [ computed| virtual| generated] è in maiuscolo.

Il concetto di MySQL 5.7 è spiegato qui e qui . È stato in MariaDB per un po 'più a lungo e il concetto è anche spiegato qui . Alcuni possibili usi sono suggeriti qui , ma in realtà sei solo limitato dalla tua immaginazione. Possono essere visti come un sostituto conveniente (e meno soggetto a errori) per i trigger.

Per il tuo particolare caso d'uso, potresti ricavare un numero da un campo di testo "+" -> "00" (o qualunque sia il tuo prefisso internazionale). Solo un pensiero.


Fantastico, puoi migliorare un po 'la tua domanda aggiungendo alcune domande? Voglio dire, ho avuto il concetto, ma non sono sicuro di come creare i valori virtualo generated. Sto pensando in uso CONCATo qualcos'altro ma non ne sono affatto sicuro. Inoltre citi una ricerca CAPSusando LIKEpotresti metterne anche un esempio? Che dire delle prestazioni delle colonne calcolate al volo ( virtual) vs persisted (generate`)?
ReynierPM,

1

Hmm. I numeri di telefono sono fatti di numeri. L'uso di varchar consente all'utente di archiviare qualsiasi tipo di formattazione, con (o no, con - o. E crea rapidamente un pasticcio con i tuoi dati. Un formato di telefono # dipende dal "paese", la maschera dovrebbe essere legata al paese. è un'estensione ed è facoltativa, quindi dovrebbe essere memorizzata in un "campo estensione". (anche int). Per 1-800-DBA-HELP, la convertirei al volo e memorizzerei il numero effettivo. Se hai davvero bisogno di questi numero di telefono leggibile dall'uomo, memorizzalo in un campo varchar separato.


1

Di solito memorizzo i numeri di telefono in testo semplice . La formattazione e la visualizzazione lo lasciano al codice client.

Qui, più di, come si memorizza? quello che hai intenzione di fare con quel numero di telefono è davvero importante.

Se la tua azienda desidera eseguire chiamate in uscita dal tuo sistema, l'applicazione estrarrà solo numeri. Se la tua azienda desidera effettuare chiamate internazionali , archivia il prefisso internazionale e il prefisso in colonne separate.

Se la tua azienda desidera effettuare rapporti , l'applicazione formatterà e visualizzerà con estensione e numeri separatamente.

Da quanto ho capito, progettare un modello di dati universale per il numero di telefono non è una buona idea. Ogni paese ha numeri, estensioni e prefissi diversi da quelli del prefisso. Inoltre, sono venuto a sapere che alcuni paesi non hanno un prefisso.

Questo potrebbe non rispondere alla tua domanda, ma aiuterà ad ampliare la nostra comprensione. Grazie.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.