mysql Datentyp für Telefonnummer und Adresse
-
12-09-2019 - |
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.
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.