wake-up-neo.net

MySQL-Datentyp für Telefonnummer und Adresse

Ich möchte die Telefonnummer in einem Formular eingeben, einschließlich Landesvorwahl und Durchwahl

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

Wenn tel_number größer als 15 Bit ist, welchen Datentyp kann ich verwenden, verwende ich besser Bigint(20)?

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

Wenn ich zum Beispiel einen Ländercode für Kanada habe, kann ich +2 oder 002 verwenden. Was ist besser für die Verarbeitung?

Danke für deinen Rat.

48
Jiangong SUN

Ich persönlich verwende keinen numerischen Datentyp, um Telefonnummern oder verwandte Informationen zu speichern.

Wie speichert man eine Nummer zB 001234567? Es wird als 1234567 enden und die führenden Nullen verlieren.

Natürlich können Sie es immer mit der linken Maustaste auffüllen, aber das setzt voraus, dass Sie genau wissen, wie viele Stellen die Nummer haben sollte.

Dies beantwortet nicht Ihren gesamten Beitrag,
Nur meine 2 Cent

67
o.k.w

Tatsächlich können Sie ein varchar für eine Telefonnummer verwenden. Sie benötigen kein int, da Sie keine Arithmetik für die Zahlen durchführen werden.

46

Speichern Sie sie als zwei Felder für Telefonnummern - eine "Nummer" und eine "Maske" als TinyText Typen die nicht mehr als 255 Elemente benötigen.

Bevor wir die Dateien speichern, analysieren wir die Telefonnummer, um die Formatierung zu erhalten, die verwendet wurde und die die Maske erzeugt. Anschließend speichern wir die Nummer nur zweistellig, z.

Eingabe: (0123) 456 7890
Nummer: 01234567890
Maske: (nnnn)_nnn_nnnn

Theoretisch können wir auf diese Weise Vergleichssuchen für das Feld "Nummer" durchführen, z. B. alle Telefonnummern abrufen, die mit einer bestimmten Vorwahl beginnen, ohne sich darum kümmern zu müssen, wie sie von den Benutzern eingegeben wurden

31
Dan Kelly

Ich speichere normalerweise Telefonnummern als BIGINT im E164-Format.

E164 beginnt niemals mit einer 0, wobei die ersten Ziffern der Ländercode sind.

+441234567890
+44 (0)1234 567890
01234 567890

usw. würde gespeichert als 441234567890.

24
Curon

ich würde ein Varchar für Telefonnummern verwenden. Auf diese Weise können Sie auch + und () speichern, was manchmal in Telefonnummern zu sehen ist (wie Sie selbst erwähnt haben). und Sie müssen sich nicht darum kümmern, alle Bits in ganzen Zahlen zu verbrauchen.

7
kon

Ich bin mir nicht sicher, ob es überhaupt eine gute Idee ist, ganze Zahlen zu verwenden. Einige Zahlen können Sonderzeichen enthalten (z. B. # als Teil der Erweiterung), mit denen Sie ebenfalls umgehen sollten. Daher würde ich vorschlagen, stattdessen Varchars zu verwenden.

5
nfechner

Wenn weniger als 1 Mio. Datensätze gespeichert werden sollen und hohe Leistung kein Problem darstellt, wählen Sie varchar (20)/char (20). Andernfalls ist int für die Speicherung von sogar 100 Mio. globalen Geschäfts- oder privaten Telefonen am besten geeignet. Grund: kleinerer Schlüssel -> höhere Lese-/Schreibgeschwindigkeit, auch beim Formatieren können Duplikate möglich sein.

1 Telefon in Zeichen (20) = 20 Bytes vs 8 Bytes bigint (oder 10 vs 4 Bytes int für lokale Telefone, bis zu 9 Ziffern), weniger Einträge können in den Indexblock eingegeben werden => Weitere Blöcke => Weitere Suchanfragen finden Sie unter this (geschrieben für MySQL, sollte aber für andere relationale Datenbanken zutreffen).

Hier ist ein Beispiel für Telefontabellen:

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

oder mit Verarbeitung/Aufteilung vor dem Einfügen (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
;

Auch "die Telefonnummer ist keine Nummer", ist meiner Meinung nach relativ zur Art der Telefonnummern. Wenn es sich um ein internes Mobiltelefonbuch handelt, sind die Zeichenfolgen in Ordnung, da der Benutzer möglicherweise GSM-Hash-Codes speichern möchte. Wenn Sie E164 Telefone speichern, ist bigint die beste Option.

3
Stefan Rogin

Ziehen Sie eine Normalisierung auf das Format E.164 in Betracht. Für eine vollständige internationale Unterstützung benötigen Sie ein VARCHAR mit 15 Ziffern.

Siehe Twilios Empfehlung für weitere Informationen zur Lokalisierung von Telefonnummern.

3
00500005

INT (10) bedeutet keine 10-stellige Zahl, sondern eine ganze Zahl mit einer Anzeigebreite von 10 Stellen. Der Maximalwert für ein INT in MySQL ist 2147483647 (oder 4294967295, falls nicht signiert).

Sie können ein BIGINT anstelle von INT verwenden, um es als Zahl zu speichern. Mit BIGINT sparen Sie 3 Bytes pro Zeile über VARCHAR (10).

"Land + Gebiet + Nummer getrennt speichern". Sie können versuchen, einen VARCHAR (20) zu verwenden. Auf diese Weise können Sie internationale Telefonnummern ordnungsgemäß speichern, falls dies erforderlich sein sollte.

2
Irshad Khan

varchar oder text sollten die besten datentypen zum speichern von handynummern sein, denke ich.

1
abhinawbharat04