Обработка и хранение номеров телефонов в базе данных

Ниже — диалог с иишечкой, варианты обработки RegEx на выбор, для SQLPHPPythonJavaScriptVBAExcel. Рабочие решения в качестве склеротника, чтоб в другой раз легче искалось.

про Excel чуть ниже ↓

Рекомендуемый формат хранения

Лучше всего хранить номера телефонов в каноническом (нормализованном) формате:

  • Только цифры (без пробелов, тире, скобок и других символов)

  • С кодом страны (префиксом), например +7 или 7 для России

  • В текстовом поле (VARCHAR), а не как число

Пример: 79161234567 (для российского номера +7 (916) 123-45-67)

Обработка нежелательных символов

Перед сохранением в базу данных нужно:

  1. Удалить все нецифровые символы: пробелы, тире, скобки, плюсы и т.д.

  2. Оставить только цифры

  3. При необходимости добавить код страны по умолчанию

Примеры

SQL (при вставке/обновлении)

-- Удаление всех нецифровых символов
UPDATE contacts 
SET phone = REGEXP_REPLACE(phone, '[^0-9]', '', 'g')
WHERE phone ~ '[^0-9]';

PHP

function normalizePhone($phone) {
    // Удаляем все нецифровые символы
    $normalized = preg_replace('/[^0-9]/', '', $phone);
    
    // Если номер начинается с 8 (российский), заменяем на 7
    if (strlen($normalized) == 11 && $normalized[0] == '8') {
        $normalized[0] = '7';
    }
    
    return $normalized;
}

Python

import re

def normalize_phone(phone):
    # Удаляем все нецифровые символы
    normalized = re.sub(r'[^\d]', '', phone)
    
    # Российские номера: заменяем 8 на 7 в начале
    if len(normalized) == 11 and normalized.startswith('8'):
        normalized = '7' + normalized[1:]
    
    return normalized

JavaScript

function normalizePhone(phone) {
    // Удаляем все нецифровые символы
    let normalized = phone.replace(/\D/g, '');
    
    // Российские номера: заменяем 8 на 7 в начале
    if (normalized.length === 11 && normalized.startsWith('8')) {
        normalized = '7' + normalized.slice(1);
    }
    
    return normalized;
}

Дополнительные рекомендации

  1. Валидация: проверяйте длину номера и допустимые коды стран перед сохранением

  2. Индексация: создавайте индекс по полю с телефоном для быстрого поиска

  3. Отображение: форматируйте номер для вывода (добавляйте пробелы, тире и т.д. на уровне приложения)

  4. Международные номера: храните с кодом страны

  5. NULL vs пустая строка: определитесь, как обрабатывать отсутствие номера

Пример форматирования для вывода (Python):

def format_phone(normalized_phone):
    if len(normalized_phone) == 11 and normalized_phone.startswith('7'):
        return f"+7 ({normalized_phone[1:4]}) {normalized_phone[4:7]}-{normalized_phone[7:9]}-{normalized_phone[9:11]}"
    return normalized_phone  # или другой формат для международных номеров

Обработка номеров телефонов в Excel

Примеры обработки номеров телефонов в Excel:

1. Удаление всех нецифровых символов

Формула для извлечения только цифр (сложный вариант для старых версий Excel до 2016):

=СУММПРОИЗВ(ПСТР(0&A2; КРУПН(ИНДЕКС(ЕЧИСЛ(--ПСТР(A2; СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))); 1))*СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))); 0); СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))))+1; 1)*10^СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2)))/10)

Более простая формула (для Excel 2016 и новее):

=ОБЪЕДИНИТЬ(""; ИСТИНА; ЕСЛИОШИБКА(ПСТР(A2; СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))); 1)+0; ""))

2. Форматирование номеров телефонов

Наводим красоту:

Отформатируем российские номера (из 11 цифр).
Добавим в начале +7, далее по шаблону скобки, тире и пробелы, получится так: +7 (000) 000-00-00

=ЕСЛИ(ДЛСТР(A2)=11; "+7 (" & ПСТР(A2;2;3) & ") " & ПСТР(A2;5;3) & "-" & ПСТР(A2;8;2) & "-" & ПСТР(A2;10;2); A2)

Настройка через формат ячеек:

  1. Выделите ячейки

  2. Правой кнопкой → Формат ячеек

  3. Выберите «Все форматы» и введите:

    • Для российских номеров: +7 (000) 000-00-00

    • Для международных: +0 (000) 000-0000

3. Проверка корректности номера

Проверка длины номера:

=ЕСЛИ(ИЛИ(ДЛСТР(A2)=11; ДЛСТР(A2)=10); "Корректный"; "Некорректный")

Проверка кода страны/оператора:

=ЕСЛИ(И(ДЛСТР(A2)=11; ЛЕВСИМВ(A2;1)="7"); "Россия"; "Другая страна")

4. Массовая обработка с помощью «Текст по столбцам»

  1. Выделите столбец с номерами

  2. Данные → Текст по столбцам

  3. Выберите «С разделителями» → Далее

  4. Укажите разделители (пробел, скобки, тире)

  5. Нажмите «Готово», затем объедините столбцы с цифрами

5. Замена 8 на +7 в начале номера

=ЕСЛИ(ЛЕВСИМВ(A2;1)="8"; "7"&ПРАВСИМВ(A2;ДЛСТР(A2)-1); A2)

Пример полной обработки

  1. Столбец B (только цифры):

     
    =ОБЪЕДИНИТЬ(""; ИСТИНА; ЕСЛИОШИБКА(ПСТР(A2; СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))); 1)+0; ""))
  2. Столбец C (нормализованный вид):

     
    =ЕСЛИ(ЛЕВСИМВ(B2;1)="8"; "7"&ПРАВСИМВ(B2;ДЛСТР(B2)-1); B2)
  3. Столбец D (форматированный вид):

     
    =ЕСЛИ(ДЛСТР(C2)=11; "+7 (" & ПСТР(C2;2;3) & ") " & ПСТР(C2;5;3) & "-" & ПСТР(C2;8;2) & "-" & ПСТР(C2;10;2); C2)

К слову:

  • Для работы функций ОБЪЕДИНИТЬ и ЕСЛИОШИБКА нужен Excel 2016 или новее
  • В более старых версиях Excel для удаления нецифровых символов можно использовать макрос VBA:

Макрос VBA для удаления нецифровых символов:

 
Function OnlyDigits(s As String) As String
    Dim i As Integer
    Dim result As String
    For i = 1 To Len(s)
        If IsNumeric(Mid(s, i, 1)) Then
            result = result & Mid(s, i, 1)
        End If
    Next
    OnlyDigits = result
End Function

Если что, напомним как добавить макрос и заставить его работать:

1) В Excel, Word, PP и т.д., нажать Alt + F11, или кнопку Visual Basic на вкладке Разработчик. В меню редактора VBA вставить новый модуль Insert — Module

 и вставить в окошко редактора расположенный выше код, далее можно сохранить код, нажав
 Ctrl + S и закрыть окно VBA (Alt + F4);

2) Нажать Alt + F8, выбрать макрос и нажать кнопку Выполнить.

Скачать пример простой обработки номеров телефонов в Excel:

Telegram
VK
Email
Прокрутить вверх