Datentyp für Telefonnummer: VARCHAR, INT oder BIGINT?

12

Dies wird also die Dummy-Frage des Jahres sein, aber ich muss sie stellen, da dies nicht das erste Mal ist, dass ich dies durchläuft. Werfen Sie einen Blick auf die folgende Tabellendefinition:

Bildbeschreibung hier eingeben

Werfen Sie einen Blick auf die Spalte , from_numberdie eine ist VARCHAR(45)gerade jetzt , aber es wird eine Telefonnummer halten. Da ich nicht weiß, wie viele Nummern ein Telefon auf der ganzen Welt haben kann, versuche ich, fast alle zu erfassen. Ich möchte die Integrität der Datenbank , so viel wie möglich zu halten , so dass ich denke , VARCHARist keine richtige Art für zu halten diese Art von Informationen - vielleicht bin ich falsch, sagen Sie mir - so ich in Veränderung denke INToder sogar BIGINT.

Wenn ich eine Spalte in Workbench definiere, sollte ich ()nicht in allen Fällen die Zahl in Klammern angeben, sondern in den Fällen, die ich zuvor erwähnte. Wenn ich das mache: BIGINT()Ich habe diesen Fehler bekommen:

Bildbeschreibung hier eingeben

Die mich leiten ein wenig über diesen MySQL - Typ lesen hier . Grundsätzlich lautet die Info wie folgt:

Eine große ganze Zahl. ... Der vorzeichenlose Bereich liegt zwischen 0 und 18446744073709551615.

Was mich fragen lässt: Welchen Wert sollte ich für Klammern festlegen, wenn ich einen BIGINT()Typ definiere ? (Ich verwende BIGINT, weil ich nicht weiß, ob INT so viele Nummern enthalten kann, wie ein Telefon haben könnte - vielleicht irre ich mich auch). Wie kann eine Spalte in MariaDB / MySQL-Datenbanken richtig erstellt werden?

Auf jeden Fall würde ich gerne Ihre Meinung, Erfahrung und natürlich eine Antwort bekommen

Hinweis: Ich verwende die neueste Version von MySQL Workbench zum Erstellen des ER-Diagramms. Ich benutze auch MariaDB 10.0.x

ReynierPM
quelle

Antworten:

13

Wie würden Sie mit einer Telefonnummer mit einer Durchwahl wie "+ 1-000-000-0000 Durchwahl 1234" umgehen?

Beachten Sie, dass das "+" bedeutet, dass internationale Wählregeln angewendet werden sollten. Aus Nordamerika kennt das System automatisch "011" vor internationalen Anrufen usw.

Was ist mit Telefonnummern wie "1-800-DBA-HELP"?

Ich würde normalerweise Telefonnummern als Text speichern. Allerdings kommt es darauf an, wie kritisch Ihre Rufnummernspalte ist. Wenn Sie über diese Spalte automatische Wählfunktionen ausführen, möchten Sie wirklich sicherstellen, dass nur Nummern enthalten sind und die Daten wohlgeformte Telefonnummern darstellen.

Sie könnten separate Spalten für Nebenstellen und Telefonnummern mit Text haben, z. B. das Beispiel "1-800-DBA-HELP", das ich bereitgestellt habe.

Max Vernon
quelle
Ja, sie werden kritisch sein, so dass ich in Zukunft keine Fehler mehr machen werde, basierend darauf, dass ich nur Zahlen zulassen würde. Was ist Ihr Vorschlag? Es ist einfach, eine neue Spalte hinzuzufügen, die die Durchwahlnummer enthält, oder ich möchte die Leute dazu bringen, Zahlen 1-800-DBA-HELPnach Ziffern
einzugeben
Es hängt wirklich von Ihren Anforderungen ab. Wenn Sie die Erkennbarkeit des Menschen bewahren müssen, möchte ich die textbasierten Zahlen sicher irgendwo aufbewahren, wahrscheinlich in einem Textfeld. Wenn Sie sich nicht für den Textteil interessieren, speichern Sie sie nicht.
Max Vernon
1
INT ist sicherlich nicht groß genug, wenn Sie die vollständige Nummer mit der Landesvorwahl speichern. BIGINT ist wahrscheinlich groß genug.
Max Vernon
1
Ich möchte mindestens 20 Ziffern.
Max Vernon
1
Mit MariaDB können Sie ein berechnetes Feld verwenden, um nur die Ziffern für eine automatische Wählhilfe zu extrahieren. Vielleicht in MySQL 5.7 (nicht sicher).
Vérace
2

Zuvor wurde geschrieben:

"Mit MariaDB könnten Sie ein computedFeld verwenden, um nur die Ziffern eines automatischen Wählers zu extrahieren. Funktioniert auch für MySQL 5.7."

Als Antwort auf die diesbezügliche Frage des OP ("Kannst du mir ein bisschen erklären, was du mir erzählst?"), Hier eine Erklärung.

Viele Datenbanksysteme haben diese Funktion inzwischen eingeführt. Dies sind Felder, die als " computed", " virtual" oder " generated" bezeichnet werden und von Werten in anderen Feldern abgeleitet sind. Die Leistung dieser Funktion hängt von Ihrem RDBMS ab. Ich weiß, dass Oracle, Firebird, MariaDB und jetzt MySQL 5.7 sie haben. Andere wahrscheinlich auch.

Ein einfaches Beispiel wäre, eine Nachnamenspalte und eine berechnete Spalte zu haben, die "speichert" (denken Sie daran, sie können virtuell sein - dh im laufenden Betrieb berechnet werden oder sie können physisch auf der Festplatte gespeichert werden), wobei der Nachname als alle Großbuchstaben angegeben wird einfacher suchen. Auf diese Weise müssen Sie nur suchenCAP s (z. B. mit LIKE) und wissen, dass die Daten in [ computed| durchsucht werden virtual| generated] Feld ist in groß geschriebenem Text.

Das Konzept für MySQL 5.7 wird hier und hier erklärt . Es ist schon länger in MariaDB und das Konzept wird auch erklärt hier . Einige Verwendungsmöglichkeiten werden hier vorgeschlagen , aber Sie sind wirklich nur durch Ihre Vorstellungskraft eingeschränkt. Sie können als praktischer (und weniger fehleranfälliger) Ersatz für Trigger angesehen werden.

Für Ihren speziellen Anwendungsfall können Sie eine wählbare Nummer aus einem Textfeld "+" -> "00" ableiten (oder wie auch immer Ihre internationale Vorwahl lautet). Nur ein Gedanke.

Vérace
quelle
Gut, können Sie Ihre Frage ein wenig verbessern, indem Sie einige Fragen hinzufügen? Ich meine, ich habe das Konzept, bin mir aber nicht sicher, wie ich die virtualoder generatedWerte schaffen soll. Ich denke in Gebrauch CONCAToder etwas anderes, aber überhaupt nicht sicher. Sie erwähnen auch eine Suche CAPSmit. LIKEKönnen Sie auch ein Beispiel dafür anführen? Was ist mit der Leistung von Spalten, die im laufenden Betrieb berechnet ( virtual) vs persisted (generiert) werden?
ReynierPM
1

Hmm. Telefonnummern bestehen aus Zahlen. Mit varchar kann der Benutzer jede Art von Formatierung mit (oder nicht mit - oder - speichern und es kommt schnell zu einem Durcheinander mit Ihren Daten. Ein Telefonformat ist "landesabhängig", die Maske sollte an das Land gebunden sein ist eine Erweiterung und ist optional, sollte also in einem "Erweiterungsfeld" gespeichert werden (auch int.). Für 1-800-DBA-HELP würde ich das im laufenden Betrieb konvertieren und die tatsächliche Nummer speichern. Wenn Sie diese wirklich benötigen Für Menschen lesbare Handynummer, speichern Sie sie in einem separaten varchar-Feld.

greenlitmysql
quelle
1

Ich speichere normalerweise die Telefonnummern in einfachem Text . Formatieren und Anzeigen überlassen Sie den Client-Code.

Hier mehr als, wie Sie speichern? Was wirst du mit dieser Telefonnummer machen? ist wirklich wichtig.

Wenn Ihr Unternehmen ausgehende Anrufe von Ihrem System ausführen möchte, extrahiert die Anwendung nur Nummern. Wenn Ihr Unternehmen Auslandsgespräche führen möchte , speichern Sie die Landes- und Ortsvorwahl in separaten Spalten.

Wenn Ihr Unternehmen Berichte erstellen möchte , wird die Anwendung separat formatiert und mit Durchwahl und Nummern angezeigt.

Nach meinem Verständnis ist das Entwerfen eines universellen Datenmodells für eine Telefonnummer keine gute Idee. Jedes Land hat andere Nummern, Nebenstellen und Vorwahlen als die Landesvorwahl. Außerdem habe ich erfahren, einige Länder keine Vorwahl haben.

Dies beantwortet Ihre Frage möglicherweise nicht, hilft jedoch dabei, unser Verständnis zu erweitern. Vielen Dank.

rathishDBA
quelle