it-swarm-eu.dev

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

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

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

Ab sofort erwarten wir Telefonnummern in einer Reihe von 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 binden (wenn Aktivitäten wie die Vorverarbeitung zu umfangreich sind), wenn einige Quelldaten eingehen.

Anregungen sind willkommen ..

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

70
John

Umfasst dies:

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

Wenn all dies nicht zutrifft, würde ich ein 10-Zeichen-Feld verwenden und alle nicht numerischen Daten entfernen. Wenn das erste ein Ja ist und die anderen zwei 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 zwei Felder und eine Art verrückten Parser verwenden, um festzustellen, was Erweiterung oder andere Daten sind, und entsprechend damit umzugehen. Natürlich könnten Sie die 2. Spalte umgehen, indem Sie etwas mit dem Index tun, bei dem die zusätzlichen Zeichen beim Erstellen des Index entfernt werden. Ich würde jedoch 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 die Hauptmethode ist, mit der etwas an der Tabelle getan wird, speichern Sie nur die Ziffern in einer sekundären Spalte als Ich sagte, und dann machen Sie den Index für diese Spalte die gruppierte.

50
Kearns

Wir verwenden varchar (15) und indizieren dieses Feld mit Sicherheit.

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 getrennte Speicherung einer Weltzonenkennzahl oder einer Landeskennzahl, um Anfragen 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

36
Brad Osterloo

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

4
Joseph Bui

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

Wenn ich bin etwas Offensichtliches vermisse, würde ich es lieben, wenn jemand darauf hinweisen würde ...

3
cori

Ich würde einen varchar (22) verwenden. Groß genug für eine nordamerikanische Telefonnummer mit Durchwahl. Sie sollten alle bösen '(', ')', '-' Zeichen entfernen oder sie einfach in einem einheitlichen Format analysieren.

Alex

3
Alex Fort

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 Erweiterung speichern, die groß genug für internationale Nummern ist und nur 9 Byte Speicherplatz benötigt. Auch Indizes sind schnell.

2
fjleon

SQL Server 2005 ist ziemlich gut für Teilzeichenfolgenabfragen für Text in indizierten Varchar-Feldern optimiert. Für 2005 haben sie neue Statistiken in die String-Zusammenfassung für Indexfelder aufgenommen. Dies hilft erheblich bei der Volltextsuche.

2
Joseph Daigle

Es ist ziemlich üblich, ein "x" oder "ext" zu verwenden, um Erweiterungen anzugeben. Erlauben Sie daher 15 Zeichen (für vollständige 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.

1
Rob G

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

1
John Sheehan

Normalisieren Sie die Daten und speichern Sie sie als Varchar. Das Normalisieren könnte schwierig sein.

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

1
Iain Holder

Verwenden Sie ein varchar -Feld mit einer Längenbeschränkung.

1
user13270

Da Sie viele verschiedene Rufnummernformate berücksichtigen müssen (und wahrscheinlich auch Nebenstellen usw. einschließen müssen), ist es möglicherweise am sinnvollsten, sie wie jede andere Variable zu behandeln. Wenn Sie die Eingabe steuern könnten, könnten Sie eine Reihe von Ansätzen wählen, um die Daten nützlicher zu machen, aber das klingt nicht so.

Sobald Sie sich dazu entschließen, es einfach wie eine andere Zeichenfolge zu behandeln, können Sie sich darauf konzentrieren, die unvermeidlichen Probleme in Bezug auf fehlerhafte Daten, die mysteriöse Formatierung von 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 dessen Erfassung Sie keine Kontrolle hatten.

1
unicorn.ninja

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

1

Mir ist klar, dass dieser Thread alt ist, aber es ist erwähnenswert, dass das Speichern als numerischer Typ für Formatierungszwecke, insbesondere in .NET Framework, von Vorteil ist.

IE

.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string
1
Mr. Tripodi

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

Da Sie keine Kontrolle über die Quelldaten haben, können Sie die Daten aus der XML-Datei analysieren und in das richtige Format konvertieren, damit keine Probleme mit den Formaten eines bestimmten Landes auftreten, und sie in einer separaten Tabelle speichern, sodass: Indizieren und Abrufen sind effizient.

Vielen Dank.

0
Jayghosh Wankar