Хранение номера мобильного телефона в БД

Royal Flash

-=MaestrO=-
Планирую хранить номера мобильных в БД MySQL (только цифры). На первый взгляд, чтобы хранить номер нужен строковый столбец char(7) или varchar(7), так как номер может начинаться с нуля(ей). Но немного поразмыслив, придумал такой вариант: хранить номер в mediumint(8) unsigned, только перед добавлением в БД добавлять в начало номера единицу.

При хранении номера телефона, как числа - появляются неоспоримые плюсы: поиск производится заметно быстрее, чем по строковым значениям. Но вот не всплывут ли где-то "грабли" при таком варианте? Т.е. чтобы найти нужный номер, добавляем к нему в начало 1, но вот может быть есть такие варианты, которые я не учел?
 

prolis

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

Royal Flash

-=MaestrO=-
Да, в международном, но код оператора хранится в отдельном столбце. Весь мусор из номера телефона удаляется еще при его вводе.
А что такое IWR?
 

fixxxer

К.О.
Партнер клуба
Можно еще добавить tinyint поле с длиной номера.

Если уж совсем нормализацию делать то наверное так вобщем

country_code
region_code -- тут не может быть ведущего нуля по стандартам, кстати. в частности потому была замена 095->495 мск
phone_number
phone_number_length

А вообще тут имеется бардак. http://ru.wikipedia.org/wiki/Телефонный_план_нумерации Если делать удобно для пользователей, то по уму надо еще парсер, учитывающий для каждого региона местные реалии и конвертирующий в международный формат.
 

prolis

Новичок
IVR - услуга голосового управления, но вообще я имел в виду цель хранения, если по ним надо будет звонить и идентифицировать - то полный формат. Мусор на входе после выгрузки из АТС. Последний совет не мудрить с цифровым форматом, а то и 03 не спасет:)
 

Royal Flash

-=MaestrO=-
Спасибо за ответы. Вообще база именно для мобильных - отсылать СМС. Так как все мобильные (пользователей) имеют строго 7 цифр (короткие платные номера не нужны априори) - phone_number_length не нужен. Пока-что больше нравится решение со стоковым хранением номеров телефонов - поставил char(7) и забыл :)
 

fixxxer

К.О.
Партнер клуба
А зачем char если строго 7? Почему не делать просто sprintf('%07d', $phone_num) при выборке?
 

Royal Flash

-=MaestrO=-
Я думал над этим вариантом, но если когда-нибуть, прийдется проводить поиск по телефонам - могут всплыть "грабли". Хотя если не учитывать маловероятные условия поиска, например, выбрать все телефоны, начинающиеся с 123, то такой вариант, вроде бы, не плох...
 

Royal Flash

-=MaestrO=-
ZEROFILL это то же, что и sprintf('%07d', $phone_num), только на стороне MySQL. Найти номера, начианающиесе с 123 - не проблема, а вот чтобы найти номер, у которого второе число 2 или номер начинается с 023 - прийдется переписывать запрос.

Если подойти к вопросу, с точки зрения логики, то все же нужно хранить номера телефонов и коды городов в char. Номер 0123456 не является числом - поэтому хранить его нужно в его формате, т.е. строковом.
 

Vin-Diesel

Новичок
К варианту с числами можно написать функций, чтобы они маску принимали, а возвращали набор условий.

Как вариант. Или CHAR без проблем..)
 
Сверху