Domanda

Voglio numero di telefono di ingresso in una forma, incluso il codice paese, estensione

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

Se tel_number è più grande di 15 bit, che tipo di dati posso usare, mi piacerebbe un uso migliore Bigint(20)?

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

Per esempio, se ho un codice di paese per il Canada posso usare due o 002. Quale è migliore per la lavorazione?

Grazie per i vostri consigli.

È stato utile?

Soluzione

Bene, personalmente io non uso tipo di dato numerico per i numeri di telefono o memorizzare informazioni correlate.

Come si memorizza un numero 001.234.567 dire? Si finirà come 1234567, perdendo gli zeri iniziali.

Naturalmente si può sempre lasciato-pad in su, ma che è previsto si sa esattamente quante cifre il numero dovrebbe essere.

Questo non risponde alla tua intera posta,
Solo i miei 2 centesimi

Altri suggerimenti

In realtà è possibile utilizzare un varchar per un numero di telefono. Non hai bisogno di un int, perché non si ha intenzione di eseguire operazioni aritmetiche sui numeri.

memorizzarli come due campi per i numeri di telefono -. Un "numero" e una "maschera" come tipi TinyText , che non hanno bisogno di più di 255 articoli

Prima di memorizzare i file analizziamo il numero di telefono per ottenere la formattazione che è stato usato e che crea la maschera, abbiamo poi memorizzare il numero di cifre solo per esempio.

Input: (0123) 456 7890
Numero: 01234567890
Maschera: (nnnn)_nnn_nnnn

In teoria questo ci permette di effettuare ricerche di confronto sul campo numero come ottenere tutti i numeri di telefono che iniziano con un prefisso specifico, senza doversi preoccupare di come fosse in ingresso da parte degli utenti

I solito memorizzare i numeri di telefono come BIGINT in formato E164.

E164 mai iniziare con uno 0, con le prime cifre è il codice del paese.

+441234567890
+44 (0)1234 567890
01234 567890

ecc. sarebbe stato memorizzato come 441234567890.

Vorrei utilizzare un varchar per numeri di telefono. in questo modo è anche possibile memorizzare + e (), che a volte è visto in numeri tel (come lei ha ricordato te stesso). e non si deve preoccupare di utilizzare il backup di tutti i bit in numeri interi.

Non sono sicuro che si tratti di una buona idea di utilizzare interi a tutti. Alcuni numeri possono contenere caratteri speciali (# come parte dell'estensione, per esempio), che si dovrebbe essere in grado di gestire anche. Quindi, vorrei suggerire utilizzando VARCHAR invece.

Se la memorizzazione di meno di 1 record mil, e ad alte prestazioni non è un problema andare per varchar (20) / char (20) altrimenti ho trovato che per la memorizzazione di addirittura 100 milioni di telefoni aziendali globali o telefoni personali, int è migliore . Motivo:. Chiave più piccola -> maggiore velocità di lettura / scrittura, formattazione può anche permettere di duplicati

1 telefono in char (20) = 20 byte vs 8 byte bigint (o 10 vs 4 byte int per telefoni locali, fino a 9 cifre), meno voci possono entrare nel blocco index => più blocchi => più ricerche, vedi questo per ulteriori informazioni (writen per MySQL, ma dovrebbe essere vero per altri database relazionali).

Ecco un esempio di tavoli telefono:

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

o con trattamento / frazionamento prima inserto (2 + 2 + 4 + 1 = 9 byte)

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
;

Anche "il numero di telefono non è un numero", a mio parere è relativo al tipo di numeri di telefono. Se stiamo parlando di una rubrica del cellulare interna, quindi le stringhe vanno bene, come l'utente può desiderare di memorizzare Codici GSM Hash . Se la memorizzazione E164 telefoni, bigint è l'opzione migliore.

Si consideri normalizzando a E.164 formato. Per un pieno sostegno internazionale, avresti bisogno di un VARCHAR di 15 cifre.

Vedere raccomandazione di Twilio per ulteriori informazioni sulla localizzazione dei numeri di telefono.

INT (10) non significa un numero di 10 cifre, significa un numero intero con larghezza di visualizzazione di 10 cifre. Il valore massimo per un INT in MySQL è 2147483647 (o 4294967295 se senza segno).

  

È possibile utilizzare un BIGINT anziché INT per memorizzare come numerico. utilizzando   BIGINT vi farà risparmiare 3 byte per riga sopra VARCHAR (10).

Per memorizzare "Paese + + numero a parte". Si può provare a utilizzare un VARCHAR (20), questo consente la possibilità di memorizzare i numeri di telefono internazionali correttamente, dovrebbe che necessità.

varchar o il testo dovrebbero essere i migliori tipi di dati per la memorizzazione dei numeri di cellulare credo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top