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

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

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

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

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

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

Возможно, вы захотите использовать github.com/googlei18n/libphonenumber для анализа / очистки исходных данных.

Nicholas Hirras 31.01.2018 20:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
85
1
309 834
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

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

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

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

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

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

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

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

Алекс

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

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

Ответ принят как подходящий

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

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

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

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

Да на все вопросы. Я не могу контролировать исходные данные. Есть несколько хороших предложений. Спасибо.

John 16.09.2008 22:07

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

Jon Egerton 15.08.2011 15:22

Почему не decimal(10,0) вместо char?

Mr Anderson 26.08.2016 23:15

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

Mathijs Flietstra 31.07.2017 10:38

В зависимости от того, в какой части мира вы находитесь, я не думайте, что 10 символов - это достаточно, что также отмечено в ответе Брэда.

Richardissimo 15.07.2018 08:45

Расширения и средства для бобби?

Smart Manoj 17.09.2020 07:43

Мы используем varchar (15) и обязательно index для этого поля.

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

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

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

Возможно, я упускаю из виду нечто очевидное, но какая польза от использования символьного типа данных для хранения числовых данных? А если вы храните больше, чем числовые данные (например, разделители), разве вам не понадобится более 15 символов для хранения отформатированного 15-значного числа?

FtDRbwLXw6 26.06.2012 23:00

@drrcknlsn причина в ведущем нуле - некоторые (большинство в некоторых странах) начинаются с нуля

Manse 28.02.2013 21:12

@drrcknlsn Я знаю, что этому комментарию 2 года, но в случае, если кто-нибудь встретит ваш комментарий: обычно практическое правило состоит в том, что для хранения числовых данных, которые имеют смысл выполнять математические вычисления, следует использовать целые типы данных струны. Например, сложение двух телефонных номеров или умножение номеров SIN / SSN не имеет смысла, поэтому их следует хранить в виде строк.

Marco Pietro Cirillo 23.07.2014 23:09

@drrcknlsn почему тогда не decimal(10,0) вместо char?

Mr Anderson 26.08.2016 23:17

@ Г-н А: Может быть, потому, что длина телефонного номера может варьироваться в зависимости от региона / страны. Заполнение начальными нулями тогда создало бы дополнительную проблему синтаксического анализа.

Trunk 05.08.2017 00:24

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

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

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

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

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

Решетки. -1. Невежество, а не чтение - что насчет% 233% - полное сканирование таблицы + преобразование? Это стандартная проблема, и есть стандартное решение, и это НЕ число. Что удаляет все форматирование, кстати.

TomTom 20.01.2012 19:56

@TomTom Хотя я согласен, что money не является ответом, если поиск по подстроке не требуется (и я полагаю, многим не нужно искать запись, основанную только на части номера телефона), что было бы неправильно с использованием decimal(10,0)?

Mr Anderson 26.08.2016 23:26

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

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

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

IE

.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string
stackoverflow.com/questions/75105/…
Smart Manoj 17.09.2020 07:45

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

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

Спасибо.

Не отвечает на вопрос полностью.

Smart Manoj 17.09.2020 07:55

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

Это нормально, но вы не можете хранить международные номера с кодом страны, так как некоторые номера начинаются с кода страны. Например: 0094777123123, лучше использовать поле varchar (15) с некоторой проверкой регулярного выражения.

Bubashan_kushan 18.05.2020 12:16

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