Welches ist der beste Datentyp für die Telefonnummer in MySQL und wie sollte die Java-Typzuordnung dafür aussehen?

70

Ich verwende MySQL mit Spring JDBC-Vorlage für meine Webanwendung. Ich muss die Telefonnummer nur mit Ziffern (10) speichern. Ich bin etwas verwirrt über den Datentyp, der den Datentyp verwendet.

  1. Was ist der bevorzugte Datentyp in MySQL?
  2. Was sollte der Java-Datentyp in Bean (POJO) -Klassen dafür sein?
  3. Wie kann ich diesen Datentyp mit Javax-Validierungen / Einschränkungen hinsichtlich der Länge und auch nur der zulässigen Ziffer validieren?
Vishal Zanzrukia
quelle

Antworten:

81

Streicher & VARCHAR.

  • Versuchen Sie nicht, Telefonnummern als tatsächliche Nummern zu speichern. es wird die Formatierung ruinieren, vorhergehende 0s und andere unerwünschte Dinge entfernen .

  • Wenn Sie möchten, können Sie Benutzereingaben auf nur numerische Werte beschränken, aber auch in diesem Fall behalten Sie Ihre gesicherten Daten als Zeichen / Zeichenfolgen und nicht als Zahlen bei.

  • Beachten Sie die weitere Welt und die Unterschiede zwischen Anzahl und Formatierung, bevor Sie versuchen, Längenbeschränkungen, Validierungen oder Masken (z. B. XXX-XXXX-XX) zu implementieren.

  • Nicht numerische Zeichen können in Telefonnummern gültig sein. Ein Paradebeispiel dafür ist der +Ersatz 00einer internationalen Nummer zu Beginn.

Bearbeitet von Konversation in Kommentaren:

  • Es ist einer der größeren Fehler in der Benutzeroberfläche, dass Telefonnummern irgendetwas mit Zahlen zu tun haben. Es ist viel besser, sie als Adressen zu betrachten und zu behandeln, es ist näher an dem, was sie tatsächlich sind und darstellen, als Telefonnummern.
unteilbar
quelle
Sie können die Zeichen auch nicht einschränken, wenn ein Mensch dies liest. Verschiedene Länder haben unterschiedliche Konventionen, und es besteht eine gute Chance, dass beim Überlesen einer Zahl in Land C die Konvention erkannt wird, die eine Person in Land C bei der Eingabe verwendet hat.
Yshavit
Ich würde es persönlich auf [0-9], Leerzeichen oder nur einen Bindestrich beschränken -. Lassen Sie den Benutzer formatieren, wie er möchte. Zumindest in der frühen Entwicklung würde die Formatierung von Zahlen auf meiner Feature-Liste nicht sehr weit oben stehen.
unteilbar
Aber nehmen wir an, ich möchte nur Ziffern ... und mein System wird nur für ein Land sein ... dann?
Vishal Zanzrukia
1
Eine Vereinbarung, die VARCHARam besten passt, aber nicht aus den in dieser Antwort genannten Gründen. Die Frage betrifft die Speicherung und nicht die Formatierung. Die Telefonnummer sollte vor der Speicherung in E.164 umgewandelt werden . Es gibt keine Telefonnummer, mit der 0in diesem Format begonnen werden kann. Wenn Sie also das Startzeichen entfernen +(das Sie nach dem Abrufen aus der Datenbank hinzufügen können), können Sie es als speichern BIGINT. Der einzige Nachteil dabei ist, dass es schwieriger ist, nach teilweise eingegebenen Telefonnummern zu suchen. Aber der Vorteil - es nimmt weniger Bytes ein und MySQL arbeitet schneller.
Ruslan Stelmachenko
1
"Es ist einer der größeren Fehler in der Benutzeroberfläche" Was hat das Speichern von Daten in SQL mit der Benutzeroberfläche zu tun, wenn Sie sie als Nummern (Vorwahl, Nummer) speichern können, während Sie sie auf der Clientseite nach Ihren Wünschen formatieren? warum die Speicherung unnötiger Zeichen +oder -oder sogar ein führender , 0wenn Sie effizient nutzen können smallintfür dialcodeund longintfür numberso Raum zu minimieren , und wählen Sie die Leistung zu verbessern?
Ali Kleit
19

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

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

Wenn Sie "Land + Gebiet + Nummer separat" speichern möchten. Versuchen Sie es mit einem VARCHAR (20). Auf diese Weise können Sie internationale Telefonnummern bei Bedarf ordnungsgemäß speichern.

Irshad Khan
quelle
13

Erwägen Sie die Verwendung des E.164- Formats. Für eine vollständige internationale Unterstützung benötigen Sie eine 15-stellige VARCHAR.

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

00500005
quelle
2
Was ist der Unterschied zu E.123 ?
Nowox
@nowox Sie können jederzeit online suchen, um zu sehen, ob online eine Antwort vorliegt.
Jonathan J. Pecany
3

VARCHAR mit einer Länge von wahrscheinlich 15 bis 20 wäre ausreichend und die beste Option für die Datenbank. Da würden Sie wahrscheinlich verschiedene Bindestriche und Pluszeichen zusammen mit Ihren Telefonnummern benötigen.

NcDreamy
quelle
1

Sie können var-char, String und int verwenden. Es hängt von Ihnen ab, ob Sie nur den Ländercode mit der Handynummer verwenden, als Sie int verwenden können. Wenn Sie ein spezielles Format für die Nummer verwenden, verwenden Sie String oder den Typ var-char, wenn Sie Verwenden Sie var-char, um die Größe der Nummer zu verunreinigen und den Benutzer einzuschränken.

Damon
quelle
0

Es hängt alles von Ihren Anforderungen ab. Wenn Sie eine kleine App entwickeln und nur eine bestimmte Region (Zielgruppe) abdecken, können Sie BIGINT auswählen, um nur Zahlen zu speichern, da VARCHAR mehr Byte als BIGINT verbraucht (bei optimalem Design der Speichernutzung). Wenn Sie jedoch eine groß angelegte App entwickeln und globale Benutzer ansprechen und über genügend Datenbankfunktionen zum Speichern von Daten verfügen, können Sie sich definitiv für VARCHAR entscheiden.

bala raja
quelle
0
  1. String
  2. Varchar

Dies ist meine Meinung zu meiner Datenbank, wie von meinem Mentor empfohlen

duytung112
quelle
-1

Meine Anforderung ist es, eine 10-stellige Telefonnummer im JSP anzuzeigen. Hier ist das Setup für mich.
MySQL:numeric(10)

Java-Seite:

@NumberFormat(pattern = "#")  
private long mobileNumber;

und es hat funktioniert!

bemannt
quelle
-2

In MySQL: BIGINT. In Java: Lang.

Александр Аверьянов
quelle