Тип даних для номера телефону: VARCHAR, INT або BIGINT?


12

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

введіть тут опис зображення

Подивіться на стовпець, from_numberякий зараз є, VARCHAR(45)але він буде містити номер телефону. Оскільки я не знаю, скільки номерів міг мати телефон у всьому світі, то я намагаюся охопити майже всі. Я хочу максимально зберегти цілісність бази даних, тому я вважаю, що VARCHARце не належний тип для зберігання такого роду інформації - можливо, я помиляюся, ви мені скажіть, - тож я думаю про зміну INTчи навіть рівномірність BIGINT.

Коли я визначаю стовпець у Workbench, я повинен вказати кількість між дужками ()не у всіх випадках, але в тих, про які я згадував попередні, про які я повинен був. Тож якщо я це роблю: BIGINT()я отримав цю помилку:

введіть тут опис зображення

Що допоможе мені прочитати трохи про цей тип MySQL тут . В основному інформація така:

Велике ціле число. ... Непідписаний діапазон становить від 0 до 18446744073709551615.

Що змушує мене запитати: яке значення я повинен встановити в дужках, коли я визначаю BIGINT()тип. (Я використовую BIGINT, тому що я не знаю, чи INT може вмістити стільки номерів, скільки може мати телефон - можливо, я теж помиляюся). Який правильний спосіб створити | спроектувати стовпчик у базах даних MariaDB / MySQL?

У будь-якому разі я хотів би дізнатися вашу думку, досвід і, звичайно, хотів би отримати відповідь

Примітка: я використовую останню версію MySQL Workbench для створення діаграми ER. Я також використовую MariaDB 10.0.x


Відповіді:


13

Як би ви обробляли номер телефону з розширенням, наприклад "+ 1-000-000-0000 ext 1234"?

Зауважте, що "+" вказує на міжнародні правила набору; тому з Північної Америки система автоматично знає "011" перед міжнародними дзвінками тощо.

Також як щодо номерів телефонів, таких як "1-800-DBA-HELP"?

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

Ви можете мати окремі стовпці для розширень та телефонні номери, у яких є текст, наприклад, приклад "1-800-DBA-HELP".


Так, вони будуть критичними, тому я не буду робити жодних помилок у майбутньому, виходячи з того, що я дозволяв би лише цифри, яка ваша пропозиція? Неважко додати новий стовпець, який містить номер розширення, або я хочу, щоб люди вводили цифри, як 1-800-DBA-HELPце цифри
ReynierPM

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

1
INT, звичайно, недостатньо великий, якщо ви зберігаєте повний номер з кодом країни. BIGINT, ймовірно, досить великий.
Макс Вернон

1
Я хочу хоча б 20 цифр.
Макс Вернон

1
З MariaDB ви можете використовувати обчислене поле для вилучення лише цифр для автоматичного набору номера. Можливо, в MySQL 5.7 (не впевнений).
Vérace

2

Раніше було написано:

"З MariaDB ви можете використовувати computedполе для вилучення лише цифр для автоматичного набору номера. Також працює для MySQL 5.7."

У відповідь на запитання ОП з цього приводу ("чи можете ви трохи пояснити, що ви мені говорите?"), Ось пояснення.

Зараз багато систем баз даних запровадили цю функцію. Це поля, які по-різному відомі як " computed", " virtual" або " generated", які отримані зі значень в інших полях. Потужність цієї функції буде залежати від вашої RDBMS. Я знаю, що Oracle, Firebird, MariaDB і зараз MySQL 5.7 мають їх. Інші, ймовірно, теж роблять.

Простим прикладом може бути наявність стовпця з прізвищем та обчислений стовпець, який "зберігає" (пам'ятайте, що вони можуть бути віртуальними - тобто обчислюватися на льоту, або їх фізично можна зберігати на диску), прізвище як усі великі літери, тим самим роблячи пошук простіше. Таким чином, вам потрібно лише шукати в CAPs (використовуючи, скажімо, LIKE), знаючи, що дані, що шукаються в [ computed| virtual| generated] у великому тексті.

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

Для вашого конкретного випадку ви можете отримати номер, який можна набрати з текстового поля "+" -> "00" (або будь-якого міжнародного коду набору). Просто думка.


Чудово, ви можете трохи покращити своє запитання, додавши кілька запитів? Я маю на увазі, що я отримав концепцію, але я не впевнений, як створити значення virtualабо generatedзначення. Я думаю про використання CONCATчи щось інше, але зовсім не впевнений. Також ви згадуєте пошук, CAPSвикористовуючи, чи LIKEможете ви також прикласти це? Як щодо продуктивності стовпців, розрахованих на льоту ( virtual) vs persisted (згенерованих`)?
ReynierPM

1

Хм. Номери телефонів складаються з цифр. Використання varchar дозволяє користувачеві зберігати будь-який тип форматування з (або ні, з - або.), І це швидко створює безлад з вашими даними. Формат телефону # залежить від "країни", маска повинна бути прив'язана до країни. є розширенням і не є обов'язковим, тому його слід зберігати у "полі розширення". (int також). Для 1-800-DBA-HELP я б перетворив це на льоту та зберігав фактичне число. Якщо вам справді потрібні ці людський читаний номер телефону #, зберігайте його в окремому варчарському полі.


1

Зазвичай телефонні номери зберігаю в простому тексті . Форматування та відображення залишають його в коді клієнта.

Тут, більш ніж, як ви зберігаєте? що ви збираєтеся робити з цим номером телефону , дійсно важливо.

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

Якщо ваш бізнес хоче звітувати , додаток буде форматувати та відображати з розширенням та номерами окремо.

З мого розуміння, розробка універсальної моделі даних для номера телефону не є хорошою ідеєю. Кожна країна має різні номери, розширення та код міста, окрім коду країни. Також я дізнався, що в деяких країнах немає коду міста.

Це може не відповісти на ваше запитання, але це допоможе розширити наше розуміння. Дякую.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.