Frage

Ich möchte eingegebene Telefonnummer in einer Form, einschließlich der Ländervorwahl, die Erweiterung

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, der Datentyp kann ich verwenden, ich bessere Nutzung Bigint(20) würde?

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

Zum Beispiel, wenn ich einen Ländercode für Kanada haben kann ich zwei oder 002. Was ist besser für die Verarbeitung ist?

Vielen Dank für Ihre Beratung.

War es hilfreich?

Lösung

Nun, persönlich verwende ich nicht numerischen Datentyp zu speichern, Telefonnummern oder ähnliche Informationen.

Wie lagern Sie eine Nummer 001234567 sagen? Es wird als 1234567 am Ende, die führenden Nullen zu verlieren.

Natürlich können Sie immer links-pad es nach oben, aber das ist vorausgesetzt, Sie wissen genau, wie viele Stellen die Zahl sein sollte.

Dies ist nicht Ihre gesamte Post beantworten,
Just my 2 cents

Andere Tipps

Eigentlich kann man eine varchar für eine Telefonnummer verwenden. Sie benötigen keine int brauchen, weil Sie nicht auf die Zahlen führen Rechen werden.

Speichern Sie sie als zwei Felder für Telefonnummern -. Eine „Nummer“ und eine „Maske“ als TinyText Typen , die mehr als 255 Elemente brauchen nicht

Bevor wir die Dateien speichern, analysieren wir die Telefonnummer, die Formatierung zu erhalten, die verwendet wurde, und das schafft die Maske, wir die Zahl dann speichern Sie eine Ziffer nur z.

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

Theoretisch ermöglicht dies uns Vergleich Suchen auf dem Zahlenfeld wie immer alle Telefonnummern durchzuführen, die mit einem bestimmten Vorwahl beginnen, ohne befürchten zu müssen, wie es Eingang von den Benutzern selbst war

ich in der Regel speichern Telefonnummern als BIGINT in E164-Format.

E164 nie mit einem 0 beginnen, wobei die ersten Ziffern der Vorwahl des Landes zu sein.

+441234567890
+44 (0)1234 567890
01234 567890

usw. würde als 441234567890 gespeichert werden.

ich würde eine varchar für Telefonnummern verwenden. Auf diese Weise können auch + und () speichern kann, die manchmal in Tel-Nummern zu sehen ist (wie Sie selbst erwähnt). und Sie müssen sich keine Sorgen über alle Bits in ganzen Zahlen zu verbrauchen.

Ich bin nicht sicher, ob es eine gute Idee, ganze Zahlen zu verwenden, überhaupt nicht. Einige Zahlen könnten Sonderzeichen enthalten (# als Teil der Erweiterung zum Beispiel), die Sie sollten auch zu handhaben können. Also ich würde stattdessen mit Varchars vorschlagen.

Wenn weniger als 1 mil Aufzeichnungen speichern und hohe Leistung ist kein Problem für varchar gehen (20) / char (20), ansonsten habe ich festgestellt, dass sogar 100 Milionen globale Business-Handy oder persönliche Telefone zum Speichern, int am besten . Grund:. Kleine Schlüssel -> höhere Lese- / Schreibgeschwindigkeit, auch die Formatierung von Duplikaten zulassen

1 Telefon in char (20) = 20 Bytes vs 8 Bytes bigint (oder 10 vs 4 Bytes int für lokale Telefone, bis zu 9 Ziffern), weniger Einträge geben den Index einen Block => mehr Blöcke =>-Suche, finden sie unter diese für weitere Informationen (writen für Mysql, aber es sollte für andere Relationale Datenbanken) wahr sein.

Hier ist ein Beispiel für Telefon Tabellen:

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 / Spaltung vor dem Einsatz (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 Zahl“, meiner Meinung nach der Art von Telefonnummern ist relativ. Wenn wir von einem internen Gerätespeicher sprechen, dann Strings sind in Ordnung, wenn der Benutzer speichern können möchten GSM Hash Codes . Wenn die Speicherung E164 Telefone, Bigint ist die beste Option.

Betrachten wir zur Normalisierung E.164 Format. Für vollständige internationale Unterstützung, würden Sie einen VARCHAR von 15 Stellen benötigen.

Siehe Twilio Empfehlung des für weitere Informationen über die Lokalisierung von Telefonnummern.

INT (10) bedeutet nicht, eine 10-stellige Zahl, bedeutet es, eine ganze Zahl mit einer Anzeigebreite von 10 Ziffern. Der Maximalwert für einen INT in MySQL ist 2147483647 (oder 4294967295, wenn unsigned).

  

Sie können einen BIGINT anstelle von INT es als numerischer zu speichern. Mit   BIGINT werden Sie 3 Byte pro Zeile über VARCHAR speichern (10).

„Land + Fläche + Anzahl separat“ zu speichern. Sie können versuchen, eine VARCHAR (20) verwendet wird, können Sie so die Möglichkeit, Zahlen internationalen Telefon richtig zu speichern, sollte die Notwendigkeit entstehen.

Varchar oder Text soll für die Speicherung von Handynummern die besten Datentypen sein, denke ich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top