Как лучше хранить телефонные номера в mysql?
В каком формате удобнее хранить номера телефонов(в формате 8(xxxx)xx-xx-xx) в mysql?
Если нужен поиск с учётом страны и города, то код страны в одной таблице, код города в другой, в третьей - телефон (INTEGER) и поля идентификаторов, привязанные к стране и городу. Вывод - конкатенация CONCAT_WS() со связыванием.
Если поиск не нужен - tinytext
UPD. Тут ведь ещё вот что... Зачем хранить "8"? Это всего лишь принятый в мире сигнал для выхода на межгород.
EXAMPLE.
Код:
//Таблица city
==================================
| id |city_name |phone_code|
==================================
| 1 | Moscow | 495 |
----------------------------------
| 2 | Maikop | 8772 |
----------------------------------
//Таблица phones
==================================
| id| city_code| phone_num|
==================================
| 1| 1| 1234567|
----------------------------------
| 2| 1| 8545621|
----------------------------------
| 3| 2| 325641|
----------------------------------
//Запрос SQL
SELECT @A := reverse(phones.phone_num) AS rnum
, concat('8 (',
city.phone_code,
') ',
concat_ws('-',
reverse(substring(@A, 5)),
reverse(substring(@A, 3, 2)),
reverse(substring(@A, 1, 2))
)
) AS phone
, city.city_name
FROM
city
INNER JOIN phones
ON city.id = phones.city_code
//На выхлопе получаем
================================================================
| rnum | phone | city_name |
================================================================
| 7654321 | 8 (495) 123-45-67 | Moscow |
----------------------------------------------------------------
| 1265458 | 8 (495) 854-56-21 | Moscow |
----------------------------------------------------------------
| 146523 | 8 (8772) 32-56-41 | Maikop |
----------------------------------------------------------------
==================================
| id |city_name |phone_code|
==================================
| 1 | Moscow | 495 |
----------------------------------
| 2 | Maikop | 8772 |
----------------------------------
//Таблица phones
==================================
| id| city_code| phone_num|
==================================
| 1| 1| 1234567|
----------------------------------
| 2| 1| 8545621|
----------------------------------
| 3| 2| 325641|
----------------------------------
//Запрос SQL
SELECT @A := reverse(phones.phone_num) AS rnum
, concat('8 (',
city.phone_code,
') ',
concat_ws('-',
reverse(substring(@A, 5)),
reverse(substring(@A, 3, 2)),
reverse(substring(@A, 1, 2))
)
) AS phone
, city.city_name
FROM
city
INNER JOIN phones
ON city.id = phones.city_code
//На выхлопе получаем
================================================================
| rnum | phone | city_name |
================================================================
| 7654321 | 8 (495) 123-45-67 | Moscow |
----------------------------------------------------------------
| 1265458 | 8 (495) 854-56-21 | Moscow |
----------------------------------------------------------------
| 146523 | 8 (8772) 32-56-41 | Maikop |
----------------------------------------------------------------
Помимо формата хранения еще немаловажный вопрос структура данных. Хорошая статья про хранение телефонных номеров в БД тут: