Какой тип данных должен использоваться для хранения телефонных номеров в SQL Server 2005?

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

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

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

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

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

17 ответов

Решение

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

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

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

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

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

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

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

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

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

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

Alex

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

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

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

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

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

nvarchar с предварительной обработкой, чтобы максимально стандартизировать их. Возможно, вы захотите извлечь расширения и сохранить их в другом поле.

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

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

Использовать varchar поле с ограничением длины.

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

IE

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

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

Так как вам нужно использовать много разных форматов телефонных номеров (и, возможно, включать такие вещи, как добавочные номера и т. Д.), Может иметь смысл рассматривать это так же, как и любой другой varchar. Если бы вы могли контролировать ввод, вы могли бы использовать несколько подходов, чтобы сделать данные более полезными, но это не так.

Как только вы решите просто обращаться с ним как с любой другой строкой, вы можете сосредоточиться на преодолении неизбежных проблем, связанных с неверными данными, формированием загадочных телефонных номеров и всем остальным, что всплывет. Задача будет заключаться в создании хорошей стратегии поиска данных, а не в том, как вы храните их, по моему мнению. Это всегда трудная задача иметь дело с большой кучей данных, которые вы не можете контролировать.

Всегда лучше иметь отдельные таблицы для многозначных атрибутов, таких как номер телефона.

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

Спасибо.

Нормализуйте данные и сохраните их в виде архива. Нормализация может быть сложно.

Это должно быть одноразовым хитом. Затем, когда появляется новая запись, вы сравниваете ее с нормализованными данными. Должно быть очень быстро.

Вместо этого используйте тип данных long.. не используйте int, потому что он допускает только целые числа от -32 768 до 32 767, но если вы используете длинный тип данных, вы можете вставлять числа от -2147 483 648 до 2 147 483 647.

В большинстве случаев это будет сделано с помощью bigint

Просто сохраните неформатированные телефонные номера, такие как: 19876543210, 02125551212 и т. д.

Проверьте тему о bigint против varchar

Другие вопросы по тегам