Welcher Datentyp sollte zum Speichern von Telefonnummern in SQL Server 2005 verwendet werden?

84

Ich muss Telefonnummern in einer Tabelle speichern. Bitte schlagen Sie vor, welchen Datentyp ich verwenden soll. Warten. Bitte lesen Sie weiter, bevor Sie auf Antwort klicken.

Dieses Feld muss stark indiziert werden, da Vertriebsmitarbeiter dieses Feld für die Suche verwenden können (einschließlich der Suche nach Platzhaltern).

Ab sofort erwarten wir Telefonnummern in verschiedenen Formaten (aus einer XML-Datei). Muss ich einen Parser schreiben, um in ein einheitliches Format zu konvertieren? Es könnten Millionen von Daten (mit Duplikaten) vorhanden sein, und ich möchte die Serverressourcen nicht jedes Mal (bei Aktivitäten wie zu viel Vorverarbeitung) binden, wenn Quelldaten eingehen.

Anregungen sind willkommen ..

Update: Ich habe keine Kontrolle über Quelldaten. Nur dass die Struktur der XML-Datei Standard ist. Möchte die XML-Analyse auf ein Minimum beschränken. Sobald es in der Datenbank ist, sollte der Abruf schnell sein. Ein verrückter Vorschlag hier ist, dass es sogar mit der Ajax AutoComplete-Funktion funktionieren sollte (damit Vertriebsmitarbeiter die passenden sofort sehen können). OH MEIN GOTT!!

John
quelle
1
Möglicherweise möchten Sie github.com/googlei18n/libphonenumber zum Parsen / Bereinigen der Quelldaten verwenden.
Nicholas Hirras

Antworten:

60

Umfasst dies:

  • Internationale Nummern?
  • Erweiterungen?
  • Weitere Informationen neben der tatsächlichen Nummer (wie "Nach Bobby fragen")?

Wenn all dies nein ist, würde ich ein 10-Zeichen-Feld verwenden und alle nicht numerischen Daten entfernen. Wenn das erste ein Ja und die anderen beiden ein Nein sind, würde ich zwei varchar (50) -Felder verwenden, eines für die ursprüngliche Eingabe und eines mit allen nicht numerischen Daten, die gestreift und für die Indizierung verwendet werden. Wenn 2 oder 3 ja sind, würde ich wahrscheinlich zwei Felder und eine Art verrückten Parser erstellen, um festzustellen, was eine Erweiterung oder andere Daten sind, und um angemessen damit umzugehen. Natürlich könnten Sie die zweite Spalte vermeiden, indem Sie etwas mit dem Index tun, bei dem die zusätzlichen Zeichen beim Erstellen des Index entfernt werden, aber ich würde nur eine zweite Spalte erstellen und wahrscheinlich das Entfernen von Zeichen mit einem Auslöser durchführen.

Update: Um das AJAX-Problem zu beheben, ist es möglicherweise nicht so schlimm, wie Sie denken. Wenn dies realistisch gesehen die Hauptmethode ist, mit der Tabelle zu arbeiten, speichern Sie wie gesagt nur die Ziffern in einer sekundären Spalte und machen Sie dann den Index für diese Spalte zur gruppierten.

Kearns
quelle
1
Ja zu allen Fragen. Ich habe keine Kontrolle über die Quelldaten. Einige gute Vorschläge dort. Vielen Dank.
John
13
Ich bin nicht wählerisch, aber ein Feld mit 10 Zeichen würde die meisten britischen Handynummern und viele britische Festnetznummern nicht abdecken. Würde sogar in den USA mehr als 10 erlauben, um eine zukünftige Skalierung von Telefonnummern zu ermöglichen.
Jon Egerton
2
Warum nicht decimal(10,0)statt char?
Herr Anderson
1
@ MrAnderson, ich denke, das liegt daran, dass decimal(10,0)Sie führende Nullen wieder auf die Zahl
auffüllen
Je nachdem, wo Sie sich auf der Welt befinden, denke ich nicht, dass 10 Zeichen lang genug sind , wie auch Brads Antwort hervorhebt.
Richardissimo
42

Wir verwenden varchar (15) und indizieren auf jeden Fall dieses Feld.

Der Grund dafür ist, dass internationale Standards bis zu 15 Stellen unterstützen können

Wikipedia - Telefonnummernformate

Wenn Sie internationale Nummern unterstützen, empfehle ich die separate Speicherung eines Weltzonen- oder Ländercodes, um Abfragen besser zu filtern, damit Sie nicht die Länge Ihrer Telefonnummernfelder analysieren und überprüfen müssen, um die Anzahl der zurückgegebenen Anrufe in die USA zu begrenzen Beispiel

Brad Osterloo
quelle
2
Ich kann etwas Offensichtliches übersehen, aber welchen Vorteil hat die Verwendung eines Zeichendatentyps zum Speichern numerischer Daten? Und wenn Sie mehr als numerische Daten (z. B. die Trennzeichen) speichern, benötigen Sie dann nicht mehr als 15 Zeichen, um eine formatierte 15-stellige Zahl zu speichern?
FtDRbwLXw6
13
@drrcknlsn der Grund ist die führende Null - einige (die meisten in einigen Ländern) beginnen mit einer Null
Manse
15
@drrcknlsn Ich weiß, dass dieser Kommentar 2 Jahre alt ist, aber für den Fall, dass jemand auf Ihren Kommentar stößt: Normalerweise gilt die Faustregel, dass ganzzahlige Datentypen zum Speichern numerischer Daten verwendet werden sollten, die für die Berechnung sinnvoll sind, und der Rest sind Saiten. Das Hinzufügen von zwei Telefonnummern oder das Multiplizieren von SIN / SSN-Nummern ist beispielsweise nicht sinnvoll, daher sollten sie als Zeichenfolgen gespeichert werden.
Marco Pietro Cirillo
2
@drrcknlsn warum nicht decimal(10,0)dann statt char?
Herr Anderson
@ Herr A: Vielleicht, weil die Länge der Telefonnummer von Region zu Region unterschiedlich sein kann. Das Füllen mit führenden Nullen würde dann ein zusätzliches Analyseproblem verursachen.
Kofferraum
4

Verwenden Sie CHAR (10), wenn Sie nur US-Telefonnummern speichern. Entfernen Sie alles außer den Ziffern.

Joseph Bui
quelle
3
Und ohne Erweiterungen
Chris Forrence
3

Ich vermisse hier wahrscheinlich das Offensichtliche, aber würde ein Varchar nicht lange genug für Ihre am längsten erwartete Telefonnummer funktionieren?

Wenn ich bin etwas fehlt offensichtlich, ich würde es lieben , wenn jemand sie weisen darauf hin , ...

cori
quelle
3

Ich würde einen Varchar (22) verwenden. Groß genug, um eine nordamerikanische Telefonnummer mit Nebenstelle zu halten. Sie möchten alle bösen '(', ')', '-' Zeichen entfernen oder sie einfach alle in einem einheitlichen Format analysieren.

Alex

Alex Fort
quelle
2

SQL Server 2005 ist ziemlich gut für Teilzeichenfolgenabfragen für Text in indizierten Varchar-Feldern optimiert. Für 2005 führten sie neue Statistiken in die Zeichenfolgenübersicht für Indexfelder ein. Dies hilft erheblich bei der Volltextsuche.

Joseph Daigle
quelle
2

Die Verwendung von Varchar ist ziemlich ineffizient. Verwenden Sie den Geldtyp und erstellen Sie daraus einen vom Benutzer deklarierten Typ "Telefonnummer". Erstellen Sie eine Regel, die nur positive Zahlen zulässt.

Wenn Sie es als (19,4) deklarieren, können Sie sogar eine 4-stellige Nebenstelle speichern, die groß genug für internationale Nummern ist und nur 9 Byte Speicherplatz benötigt. Indizes sind auch schnell.

fjleon
quelle
2
Grats. -1. Ingorance und nicht lesen - waht abuot% 233% - vollständiger Tabellenscan + Conversions? Dies ist ein Standardproblem und es gibt eine Standardlösung und es ist KEINE Nummer. Was übrigens alle Formatierungen entfernt.
TomTom
@TomTom Obwohl ich zustimme, dass dies moneynicht die Antwort ist, wenn die Suche nach Teilzeichenfolgen nicht erforderlich ist (und ich würde mir vorstellen, dass viele nicht nach einem Datensatz suchen müssen, der nur auf einem Teil einer Telefonnummer basiert), was wäre falsch an der Verwendung decimal(10,0)?
Herr Anderson
1

nvarchar mit Vorverarbeitung, um sie so weit wie möglich zu standardisieren. Sie möchten wahrscheinlich Erweiterungen extrahieren und in einem anderen Feld speichern.

John Sheehan
quelle
1

Normalisieren Sie die Daten und speichern Sie sie als Varchar. Das Normalisieren kann schwierig sein.

Das sollte ein einmaliger Erfolg sein. Wenn dann ein neuer Datensatz eingeht, vergleichen Sie ihn mit normalisierten Daten. Sollte sehr schnell sein.

Iain Holder
quelle
1

Da Sie viele verschiedene Telefonnummernformate verwenden müssen (und wahrscheinlich Dinge wie Nebenstellen usw. enthalten müssen), ist es möglicherweise am sinnvollsten, sie wie jedes andere Varchar zu behandeln. Wenn Sie die Eingabe steuern könnten, könnten Sie verschiedene Ansätze wählen, um die Daten nützlicher zu machen, aber das klingt nicht so.

Sobald Sie sich entschieden haben, es einfach wie eine andere Zeichenfolge zu behandeln, können Sie sich darauf konzentrieren, die unvermeidlichen Probleme in Bezug auf fehlerhafte Daten, die Bildung mysteriöser Telefonnummern und alles, was sonst noch auftaucht, zu überwinden. Die Herausforderung wird darin bestehen, eine gute Suchstrategie für die Daten zu entwickeln und nicht, wie Sie sie meiner Meinung nach speichern. Es ist immer eine schwierige Aufgabe, mit einem großen Datenstapel umzugehen, über den Sie keine Kontrolle hatten.


quelle
1

Verwenden Sie SSIS, um die Informationen zu extrahieren und zu verarbeiten. Auf diese Weise wird die Verarbeitung der XML-Dateien von SQL Server getrennt. Bei Bedarf können Sie die SSIS-Transformationen auch auf einem separaten Server durchführen. Speichern Sie die Telefonnummern mit VARCHAR in einem Standardformat. NVARCHAR wäre unnötig, da es sich um Zahlen und möglicherweise einige andere Zeichen handelt, wie '+', '', '(', ')' und '-'.

Magnus Johansson
quelle
1

Verwenden Sie ein varcharFeld mit einer Längenbeschränkung.

user13270
quelle
1

Es ist ziemlich üblich, ein "x" oder "ext" zu verwenden, um Erweiterungen anzuzeigen. Erlauben Sie daher 15 Zeichen (für volle internationale Unterstützung) plus 3 (für "ext") plus 4 (für die Erweiterung selbst), was insgesamt 22 Zeichen ergibt . Das sollte dich beschützen.

Alternativ können Sie bei der Eingabe normalisieren, sodass jedes "ext" in "x" übersetzt wird, was maximal 20 ergibt.

Rob G.
quelle
1

Es ist immer besser, separate Tabellen für mehrwertige Attribute wie die Telefonnummer zu haben.

Da Sie keine Kontrolle über Quelldaten haben, können Sie die Daten aus der XML-Datei analysieren und in das richtige Format konvertieren, damit es keine Probleme mit den Formaten eines bestimmten Landes gibt. Speichern Sie sie in einer separaten Tabelle, damit die Indizierung und Das Abrufen beider ist effizient .

Vielen Dank.

Jayghosh Wankar
quelle
Beantwortet die Frage nicht vollständig.
Smart Manoj
1

Mir ist klar, dass dieser Thread alt ist, aber es lohnt sich, den Vorteil des Speicherns als numerischer Typ für Formatierungszwecke zu erwähnen, insbesondere in .NET Framework.

IE

.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string
Herr Tripodi
quelle
0

Verwenden Sie stattdessen den Datentyp long. Verwenden Sie nicht int, da nur ganze Zahlen zwischen -32.768 und 32.767 zulässig sind. Wenn Sie jedoch den langen Datentyp verwenden, können Sie Zahlen zwischen -2.147.483.648 und 2.147.483.647 einfügen.

Ej Manalo Carbona
quelle
1
Dies ist in Ordnung, aber Sie können keine internationalen Nummern mit Ländercode speichern, da einige Nummern mit dem Ländercode beginnen. Beispiel: 0094777123123, Verwenden Sie besser ein varchar (15) -Feld mit einer Regex-Validierung.
Bubashan_kushan