web-dev-qa-db-fra.com

Quel type de données faut-il utiliser pour stocker les numéros de téléphone dans SQL Server 2005?

J'ai besoin de stocker les numéros de téléphone dans une table. Veuillez suggérer quel type de données dois-je utiliser? Attendez. S'il vous plaît lisez dessus avant de frapper la réponse ..

Ce champ doit être fortement indexé car les commerciaux peuvent utiliser ce champ pour la recherche (y compris la recherche de caractères génériques).

Pour l'instant, nous nous attendons à ce que les numéros de téléphone se présentent sous différents formats (à partir d'un fichier XML). Dois-je écrire un analyseur syntaxique pour convertir en un format uniforme? Il pourrait y avoir des millions de données (avec des doublons) et je ne veux pas gêner les ressources du serveur (dans des activités telles que le prétraitement excessif) chaque fois que des données source arrivent.

Toutes les suggestions sont les bienvenues ..

Mise à jour: Je n'ai aucun contrôle sur les données source. La structure du fichier xml est standard. J'aimerais que l'analyse xml soit au minimum. Une fois dans la base de données, l'extraction devrait être rapide. Une suggestion loufoque va Par exemple, il devrait même fonctionner avec la fonctionnalité de saisie semi-automatique Ajax (afin que les commerciaux puissent voir immédiatement les noms correspondants). OMG !!

70
John

Est-ce que cela comprend:

  • Numéros internationaux?
  • Des extensions?
  • Autres informations que le nombre réel (comme "demander pour bobby")?

Si tous ne sont pas, j'utiliserais un champ de 10 caractères et éliminerais toutes les données non numériques. Si le premier est un oui et les deux autres sont non, j'utiliserais deux champs varchar (50), un pour l'entrée d'origine et un avec toutes les données non numériques agrégées par bande et utilisées pour l'indexation. Si 2 ou 3 sont oui, je pense que je ferais deux champs et une sorte d'analyseur syntaxique fou pour déterminer ce que sont des données d'extension ou autres et les traiter de manière appropriée. Bien sûr, vous pouvez éviter la 2ème colonne en faisant quelque chose avec l'index qui supprime les caractères supplémentaires lors de la création de l'index, mais je créerais simplement une deuxième colonne et supprimerais probablement les caractères avec un déclencheur.

Mise à jour: pour résoudre le problème AJAX, il se peut que ce ne soit pas aussi grave que vous le pensez. Si cela est de manière réaliste la manière principale de traiter la table, ne stockez que les chiffres dans une colonne secondaire. J'ai dit, et ensuite faire l'index pour cette colonne le clustered.

50
Kearns

Nous utilisons varchar (15) et certainement index sur ce champ.

La raison en est que les normes internationales peuvent prendre en charge jusqu'à 15 chiffres

Wikipedia - Formats de numéros de téléphone

Si vous prenez en charge les numéros internationaux, je vous recommande de stocker séparément un code de zone mondiale ou un code de pays afin de mieux filtrer les requêtes en évitant de vous retrouver en train d'analyser et de vérifier la longueur de vos champs de numéro de téléphone afin de limiter les appels retournés aux États-Unis pour Exemple

36
Brad Osterloo

Utilisez CHAR (10) si vous ne stockez que des numéros de téléphone américains. Enlevez tout sauf les chiffres.

4
Joseph Bui

Il me manque probablement une évidence, mais un varchar ne suffirait-il pas suffisamment longtemps pour que votre numéro de téléphone attendu le plus long fonctionne correctement?

Si je am manque quelque chose d'évident, j'aimerais bien que quelqu'un le fasse remarquer ...

3
cori

Je voudrais utiliser un varchar (22). Assez grand pour contenir un numéro de téléphone nord-américain avec extension. Vous voudrez peut-être éliminer tous les méchants caractères '(', ')', '-' ou simplement les analyser dans un format uniforme.

Alex

3
Alex Fort

utiliser varchar est assez inefficace. utilisez le type d'argent et créez un type déclaré par l'utilisateur "numéro de téléphone", puis créez une règle autorisant uniquement les nombres positifs.

si vous le déclarez (19,4), vous pouvez même stocker une extension à 4 chiffres et être assez grand pour les numéros internationaux, et ne prend que 9 octets de stockage. En outre, les index sont rapides.

2
fjleon

SQL Server 2005 est plutôt bien optimisé pour les requêtes de sous-chaîne pour le texte dans les champs varchar indexés. Pour 2005, ils ont introduit de nouvelles statistiques dans le résumé de chaîne pour les champs d'index. Cela aide considérablement à la recherche en texte intégral.

2
Joseph Daigle

Il est assez courant d'utiliser un "x" ou un "ext" pour indiquer des extensions, alors autorisez 15 caractères (pour le support international complet) plus 3 (pour "ext") plus 4 (pour l'extension elle-même), pour un total de 22 caractères. . Cela devrait vous garder en sécurité.

Vous pouvez également normaliser les entrées afin que tout "ext" soit traduit en "x", ce qui donne un maximum de 20.

1
Rob G

nvarchar avec prétraitement pour les normaliser autant que possible. Vous voudrez probablement extraire des extensions et les stocker dans un autre champ.

1
John Sheehan

Normalisez les données puis stockez-les en tant que varchar. La normalisation pourrait être délicate.

Cela devrait être un coup unique. Puis, lorsqu'un nouvel enregistrement arrive, vous le comparez à des données normalisées. Devrait être très rapide.

1
Iain Holder

Utilisez un champ varchar avec une restriction de longueur.

1
user13270

Étant donné que vous devez gérer de nombreux formats de numéros de téléphone différents (et probablement inclure des éléments tels que des extensions, etc.), il peut sembler judicieux de le traiter comme vous le feriez avec tout autre varchar. Si vous pouviez contrôler l'entrée, vous pourriez adopter plusieurs approches pour rendre les données plus utiles, mais cela ne sonne pas comme ça.

Une fois que vous décidez simplement de le traiter comme n'importe quelle autre chaîne, vous pouvez vous concentrer sur la résolution des inévitables problèmes relatifs aux mauvaises données, à la mise en forme de numéros de téléphone mystérieux et à tout ce qui pourrait apparaître. Le défi consistera à élaborer une bonne stratégie de recherche pour les données et non pas comment vous les stockez à mon avis. C'est toujours une tâche difficile de gérer une pile de données importante sur laquelle vous n'aviez aucun contrôle sur la collecte.

1
unicorn.ninja

Utilisez SSIS pour extraire et traiter les informations. De cette façon, le traitement des fichiers XML sera séparé de SQL Server. Vous pouvez également effectuer les transformations SSIS sur un serveur distinct si nécessaire. Enregistrez les numéros de téléphone dans un format standard à l'aide de VARCHAR. NVARCHAR serait inutile puisque nous parlons de chiffres et peut-être de quelques autres caractères, comme '+', '', '(', ')' et '-'.

1
Magnus Johansson

Je me rends compte que ce fil est ancien, mais il convient de mentionner un avantage de stocker sous forme de type numérique à des fins de formatage, en particulier dans .NET Framework.

IE

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

Il est toujours préférable d'avoir des tables séparées pour les attributs à valeurs multiples comme le numéro de téléphone.

Comme vous n’avez aucun contrôle sur les données source, vous pouvez analyser les données du fichier XML et les convertir au format approprié afin qu’il n’y ait plus aucun problème avec les formats d’un pays donné et les stocker dans un tableau séparé pour que - l'indexation et la récupération seront efficaces.

Merci.

0
Jayghosh Wankar