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:
Werfen Sie einen Blick auf die Spalte , from_number
die 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 , VARCHAR
ist keine richtige Art für zu halten diese Art von Informationen - vielleicht bin ich falsch, sagen Sie mir - so ich in Veränderung denke INT
oder 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:
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
Antworten:
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.
quelle
1-800-DBA-HELP
nach ZiffernZuvor wurde geschrieben:
"Mit MariaDB könnten Sie ein
computed
Feld 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 suchen
CAP
s (z. B. mitLIKE
) und wissen, dass die Daten in [computed
| durchsucht werdenvirtual
|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.
quelle
virtual
odergenerated
Werte schaffen soll. Ich denke in GebrauchCONCAT
oder etwas anderes, aber überhaupt nicht sicher. Sie erwähnen auch eine SucheCAPS
mit.LIKE
Kö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?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.
quelle
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.
quelle