Який тип даних слід використовувати для зберігання телефонних номерів у SQL Server 2005?


85

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

Це поле потрібно індексувати в значній мірі, оскільки торгові представники можуть використовувати це поле для пошуку (включаючи пошук по диких символах).

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

Будь-які пропозиції вітаються ..

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


1
Можливо, ви захочете використовувати github.com/googlei18n/libphonenumber для синтаксичного аналізу / очищення вихідних даних.
Ніколас Хірас,

Відповіді:


60

Це включає:

  • Міжнародні номери?
  • Розширення?
  • Інша інформація, крім фактичної кількості (наприклад, "попроси Боббі")?

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

Оновлення: щоб вирішити проблему AJAX, це може бути не так погано, як ви думаєте. Якщо це реально основний спосіб, що-небудь робиться з таблицею, зберігайте лише цифри у вторинному стовпці, як я вже сказав, а потім зробіть індекс для цього стовпця кластерним.


1
Так на всі питання. Я не контролюю вихідні дані. Є кілька хороших пропозицій. Дякую.
Джон

13
Збираю ніт, але поле 10 символів не охоплює більшість мобільних номерів Великобританії та багато номерів наземних ліній Великобританії. Дозволить більше 10 навіть у США дозволити масштабування телефонних номерів у майбутньому.
Джон Егертон,

2
Чому не decimal(10,0)замість char?
Містер Андерсон,

1
@MrAnderson, я думаю, це тому, що decimal(10,0)коли ти потребуєш повернути нулі, повертаючи нулі, коли це потрібно ..
Матійс Флієстра

Залежно від того, де ви знаходитесь у світі, я не думаю, що 10 символів є достатньо довгими , як це також підкреслює відповідь Бреда.
Річардіссімо,

42

Ми використовуємо varchar (15) і, безумовно, індексуємо в цьому полі.

Причиною є те, що міжнародні стандарти можуть підтримувати до 15 цифр

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

Якщо ви підтримуєте міжнародні номери, я рекомендую окреме сховище коду світової зони або коду країни, щоб краще фільтрувати запити, щоб ви не знаходили розбору та перевірки довжини полів вашого номера телефону, щоб обмежити кількість зворотних дзвінків до США для приклад


2
Можливо, я пропускаю щось очевидне, але яка користь від використання типу символьних даних для зберігання числових даних? І якщо ви зберігаєте більше числових даних (наприклад, роздільники), то чи не потрібно вам більше 15 символів для зберігання відформатованого 15-значного числа?
FtDRbwLXw6

13
@drrcknlsn причиною є провідний нуль - деякі (більшість у деяких країнах) починають з нуля
Manse

16
@drrcknlsn Я знаю, що цьому коментарю 2 роки, але у випадку, якщо хтось натрапить на ваш коментар: Зазвичай правило полягає в тому, що цілі типи даних повинні використовуватися для зберігання числових даних, на яких має сенс робити математику, а решта є рядки. Наприклад, додавання двох телефонних номерів або множення номерів SIN / SSN не має сенсу, тому їх слід зберігати як рядки.
Marco Pietro Cirillo

2
@drrcknlsn чому б не decimal(10,0)тоді замість char?
Містер Андерсон,

@Mr A: Можливо, тому, що довжина телефонного номера може різнитися залежно від регіону / країни. Тоді заповнення провідними нулями створить додаткову проблему синтаксичного аналізу.
Багажник

5

Використовуйте CHAR (10), якщо ви зберігаєте лише телефонні номери США. Видаліть все, крім цифр.


3

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

Якщо я маю що - то очевидне відсутня, я б радий, якби хто - то вказати на це ...


3

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

Алекс


2

SQL Server 2005 досить добре оптимізований для запитів підрядків для тексту в індексованих полях varchar. У 2005 році вони ввели нову статистику до зведення рядків для полів індексу. Це суттєво допомагає під час пошуку повного тексту.


2

використання varchar досить неефективно. використовуйте тип грошей і створіть із нього тип "номер телефону", оголошений користувачем, і створіть правило, що допускає лише додатні числа.

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


2
Грати. -1. Невпевненість і нечитання - що приблизно% 233% - повне сканування таблиці + перетворення? Це стандартна проблема, і є стандартне рішення, і це НЕ число. Що видаляє всі форматування, до речі.
TomTom

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

1

nvarchar з попередньою обробкою, щоб максимально стандартизувати їх. Можливо, вам захочеться витягти розширення та зберегти їх в іншому полі.


1

Нормалізуйте дані, потім зберігайте як varchar. Нормалізація може бути складною.

Це має бути одноразовим хітом. Потім, коли з’являється новий запис, ви порівнюєте його із нормалізованими даними. Це повинно бути дуже швидко.


1

Оскільки вам потрібно розмістити багато різних форматів телефонних номерів (і, можливо, включати такі речі, як розширення тощо), може бути найбільш розумним просто поводитися з ним, як із будь-яким іншим varchar. Якби ви могли контролювати введення, ви можете скористатися низкою підходів, щоб зробити дані більш корисними, але це не так звучить.

Після того, як ви вирішите просто розглядати його як будь-який інший рядок, ви можете зосередитись на подоланні неминучих проблем, пов’язаних із поганими даними, таємничим форматуванням телефонного номера та будь-яким іншим, що з’явиться. Проблема полягає у створенні хорошої стратегії пошуку даних, а не в тому, як ви їх зберігаєте, на мій погляд. Завжди важке завдання - мати справу з великим набором даних, збір яких ви не мали під контролем.


1

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



1

Досить поширеним є використання символу "x" або "ext" для позначення розширень, тому дозволяється 15 символів (для повної міжнародної підтримки) плюс 3 (для "ext") плюс 4 (для самого розширення), що дає 22 символи . Це повинно тримати вас у безпеці.

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


1

Завжди краще мати окремі таблиці для багатозначних атрибутів, таких як номер телефону.

Оскільки у вас немає контролю над вихідними даними, ви можете проаналізувати дані із XML-файлу та перетворити їх у відповідний формат, щоб не виникало жодних проблем із форматами певної країни та зберігати в окремій таблиці, щоб індексація та пошук обох буде ефективним .

Дякую.


Не відповідає на запитання повністю.
Smart Manoj


0

Замість цього використовуйте тип даних long. Не використовуйте int, оскільки він дозволяє лише цілі числа від -32768 до 32767, але якщо ви використовуєте довгий тип даних, ви можете вставити числа від -2,147,483,648 до 2,147,483,647.


1
Це нормально, але ви не можете зберігати міжнародні номери з кодом країни, оскільки деякі номери починаються з коду країни. Наприклад: 0094777123123, Краще скористайтеся полем varchar (15) з деякою валідацією регулярних виразів.
Bubashan_kushan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.