Какой тип данных следует использовать для хранения телефонных номеров в SQL Server 2005? - PullRequest
68 голосов
/ 16 сентября 2008

Мне нужно хранить номера телефонов в таблице. Пожалуйста, предложите, какой тип данных я должен использовать? Подождите. Пожалуйста, прочитайте, прежде чем нажать кнопку ответа ..

Это поле должно быть сильно проиндексировано, поскольку торговые представители могут использовать это поле для поиска (включая поиск по диким символам).

На данный момент мы ожидаем, что телефонные номера будут иметь несколько форматов (из файла XML). Должен ли я написать парсер для преобразования в единый формат? Может быть миллионы данных (с дубликатами), и я не хочу связывать ресурсы сервера (в таких действиях, как предварительная обработка слишком много) каждый раз, когда поступают некоторые исходные данные ..

Любые предложения приветствуются ..

Обновление: У меня нет контроля над исходными данными. Просто структура XML-файла является стандартной. Хотел бы свести xml к минимуму. Как только он находится в базе данных, поиск должен быть быстрым. Одно сумасшедшее предположение, которое происходит здесь, заключается в том, что он должен работать даже с функцией автозаполнения Ajax (так, чтобы торговые представители могли сразу увидеть соответствующие). OMG !!

Ответы [ 15 ]

50 голосов
/ 16 сентября 2008

Включает ли это:

  • Международные номера?
  • Расширения
  • Другая информация, кроме фактического номера (например, «спросить Бобби»)?

Если всего этого нет, я бы использовал поле из 10 символов и удалил бы все нечисловые данные. Если первое - «да», а два других - «нет», я бы использовал два поля varchar (50), одно для исходного ввода и одно со всеми чередующимися нечисловыми данными и используемыми для индексации. Если 2 или 3 - да, я думаю, что я бы сделал два поля и какой-нибудь сумасшедший парсер, чтобы определить, что такое расширение или другие данные, и правильно с ними работать. Конечно, вы можете избежать 2-го столбца, выполнив что-то с индексом, где он удаляет лишние символы при создании индекса, но я бы просто создал второй столбец и, вероятно, выполнил бы удаление символов с помощью триггера.

Обновление: для решения проблемы AJAX она может быть не такой плохой, как вы думаете. Если это реально основной способ что-либо сделать с таблицей, сохраните только цифры во вторичном столбце, как я сказал, а затем сделайте индекс для этого столбца кластерным.

33 голосов
/ 16 сентября 2008

Мы используем varchar (15) и, конечно, индекс для этого поля.

Причина в том, что международные стандарты могут поддерживать до 15 цифр

Википедия - Форматы телефонных номеров

Если вы поддерживаете международные номера, я рекомендую отдельное хранение кода зоны мира или кода страны, чтобы лучше фильтровать запросы, чтобы вы не разбирались и не проверяли длину полей вашего номера телефона, чтобы ограничить количество возвращаемых вызовов в США например

4 голосов
/ 16 сентября 2008

Используйте CHAR (10), если вы храните только номера телефонов США. Удалить все, кроме цифр.

3 голосов
/ 16 сентября 2008

Я бы использовал varchar (22). Достаточно большой, чтобы вместить североамериканский номер телефона с добавочным номером. Вы хотели бы удалить все неприятные символы '(', ')', '-' или просто разобрать их все в единый формат.

Alex

3 голосов
/ 16 сентября 2008

Я, вероятно, здесь упускаю очевидное, но разве varchar не будет достаточно длинным, чтобы ваш самый ожидаемый номер телефона работал хорошо?

Если бы я пропустил что-то очевидное, я бы с удовольствием, если бы кто-то указал на это ...

2 голосов
/ 03 мая 2011

использование varchar довольно неэффективно. используйте тип money и создайте из него объявленный пользователем тип phonenumber, а также создайте правило, разрешающее использование только положительных чисел.

если вы объявите его как (19,4), вы даже можете сохранить 4-значный номер и быть достаточно большим для международных номеров, и займет всего 9 байтов. Также индексы скоростные.

2 голосов
/ 16 сентября 2008

SQL Server 2005 довольно хорошо оптимизирован для запросов на подстроки текста в индексированных полях varchar. В 2005 году они добавили новую статистику в сводку строк для полей индекса. Это значительно помогает при полнотекстовом поиске.

1 голос
/ 23 марта 2017

Я понимаю, что этот поток старый, но стоит упомянуть о преимуществах хранения в качестве числового типа для форматирования, особенно в .NET Framework.

IE

.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string
1 голос
/ 22 июля 2013

Обычно для обозначения расширений используется «x» или «ext», поэтому допускается 15 символов (для полной международной поддержки), плюс 3 (для «ext») плюс 4 (для самого расширения), что дает общее количество из 22 символов. Это должно держать вас в безопасности.

В качестве альтернативы, нормализуйте ввод, чтобы любое "ext" переводилось в "x", давая максимум 20.

1 голос
/ 16 сентября 2008

Используйте SSIS для извлечения и обработки информации. Таким образом, обработка XML-файлов будет отделена от SQL Server. При необходимости вы также можете выполнять преобразования служб SSIS на отдельном сервере. Храните телефонные номера в стандартном формате, используя VARCHAR. NVARCHAR не понадобится, поскольку мы говорим о числах и, возможно, о нескольких других символах, таких как '+', '', '(', ')' и '-'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...