Архив номеров КП: структура, создание базы данных и работа с кодировками

Мгновенный поиск в КП Архиве номеров: статусы, тарифы, клиенты. Никаких таблиц — только результат. Попробуй бесплатно!

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

КП архив номеров (далее – архив) – это специализированный набор данных‚ в котором хранится информация о телефонных номерах‚ их статусах‚ привязках к клиентам‚ тарифам и другим параметрам‚ используемым в системах КП (Контакт‑Платформа‚ Колл‑центр‚ Коммуникационный Портал). Такой архив часто применяется в телекоммуникационных компаниях‚ сервисных центрах и компаниях‑операторах для:

  • быстрого поиска и фильтрации номеров;
  • анализа активности и качества обслуживания;
  • исторического аудита изменений;
  • массовой загрузки/выгрузки данных в/из CRM‑систем.

В статье мы рассмотрим структуру архива‚ способы его создания‚ работу с кодировками (особенно важную для русскоязычных данных)‚ типичные запросы и лучшие практики по поддержке.


Основные понятия

1.1 Что такое «КП»?

Термин КП в контексте телефонных систем обычно расшифровывается как:

  • Контакт‑Платформа – набор программных модулей для работы с клиентскими данными;
  • Колл‑центр – система управления входящими и исходящими звонками;
  • Коммуникационный Портал – веб‑интерфейс для операторов и администраторов.

1.2 Что хранится в архиве номеров?

Стандартный набор полей выглядит так:

Поле Тип Описание
id INT AUTO_INCREMENT Уникальный идентификатор записи.
phone_number VARCHAR(20) Телефонный номер в международном формате (+7XXXXXXXXXX).
status ENUM(‘active’‚’blocked’‚’inactive’) Текущий статус номера.
client_id INT Ссылка на запись клиента в CRM.
tariff_plan VARCHAR(50) Тарифный план‚ к которому привязан номер.
created_at DATETIME Дата и время создания записи.
updated_at DATETIME Дата последнего изменения.
notes TEXT Дополнительные комментарии (может содержать кириллицу).

Как создать архив номеров в MySQL

2.1 Подготовка базы данных

Для начала необходимо создать отдельную базу (например‚ kp_archive) и таблицу numbers. Обратите внимание на кодировку – используйте utf8mb4‚ чтобы корректно хранить русские символы.

CREATE DATABASE kp_archive
 CHARACTER SET utf8mb4
 COLLATE utf8mb4_unicode_ci;

USE kp_archive;

CREATE TABLE numbers (
 id INT AUTO_INCREMENT PRIMARY KEY‚
 phone_number VARCHAR(20) NOT NULL‚
 status ENUM('active'‚'blocked'‚'inactive') DEFAULT 'active'‚
 client_id INT NULL‚
 tariff_plan VARCHAR(50) NULL‚
 created_at DATETIME DEFAULT CURRENT_TIMESTAMP‚
 updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP‚
 notes TEXT NULL‚
 INDEX idx_phone (phone_number)
) ENGINE=InnoDB
 DEFAULT CHARSET=utf8mb4
 COLLATE=utf8mb4_unicode_ci;

2.2 Вставка данных

При работе с кириллицей важно явно указывать кодировку соединения:

<?php
$link = mysqli_connect('localhost'‚ 'user'‚ 'password'‚ 'kp_archive');
if (!$link) {
 die('Не удалось подключиться: ' . mysqli_connect_error);
}

/* Устанавливаем кодировку соединения /
mysqli_set_charset($link‚ 'utf8mb4');

/ Пример вставки */
$phone = '+7 -261234567';
$status = 'active';
$client_id = 12345;
$tariff = 'Standard';
$notes = 'Клиент из Москвы‚ запрос на изменение тарифа.';

$stmt = $link->prepare(
 "INSERT INTO numbers (phone_number‚ status‚ client_id‚ tariff_plan‚ notes)
 VALUES (?‚ ?‚ ?‚ ?‚ ?)"
);
$stmt->bind_param('ssiss'‚ $phone‚ $status‚ $client_id‚ $tariff‚ $notes);
$stmt->execute;

echo 'Запись добавлена‚ ID = ' . $stmt->insert_id;
$stmt->close;
mysqli_close($link);
?>

2.3 Массовая загрузка из CSV

Если у вас уже есть список номеров в CSV‑файле‚ используйте LOAD DATA INFILE:

LOAD DATA LOCAL INFILE '/path/to/numbers.csv'
INTO TABLE numbers
FIELDS TERMINATED BY '‚' ENCLOSED BY '"'
LINES TERMINATED BY '
'
IGNORE 1 LINES
(phone_number‚ status‚ client_id‚ tariff_plan‚ notes);

Важно‚ чтобы CSV был сохранён в UTF‑8 без BOM. Если файл в Windows‑1251‚ предварительно перекодируйте:

iconv -f windows-1251 -t utf-8 numbers_win1251.csv > numbers_utf8.csv

Поиск и фильтрация в архиве

3.1 Простой поиск по номеру

SELECT * FROM numbers
WHERE phone_number = '+7 -261234567';

3.2 Поиск с учётом частичного совпадения

Для поиска «начинающихся» номеров используйте оператор LIKE:

SELECT phone_number‚ status
FROM numbers
WHERE phone_number LIKE '+7 -26%';

3.3 Поиск с учётом регистра и кириллицы

В MySQL сравнение строк по умолчанию нечувствительно к регистру‚ но если вы используете COLLATE utf8mb4_bin‚ регистр будет учитываться:

SELECT *
FROM numbers
WHERE notes COLLATE utf8mb4_bin LIKE '%Тариф%';

3.4 Полнотекстовый поиск

Для быстрого поиска по полю notes создайте полнотекстовый индекс:

ALTER TABLE numbers ADD FULLTEXT idx_notes (notes);

SELECT *
FROM numbers
WHERE MATCH(notes) AGAINST('изменить тариф' IN NATURAL LANGUAGE MODE);

Работа с кодировками: типичные проблемы

При работе с русским языком часто встречаются «вопросительные знаки» (????) вместо букв. Основные причины:

  1. Неправильная кодировка соединения с MySQL (см. mysqli_set_charset).
  2. Файлы импорта/экспорта сохранены в другой кодировке (Windows‑1251‚ KOI8‑R).
  3. Отсутствие charset=utf-8 в заголовках HTTP‑ответа.

Решение – всегда использовать utf8mb4 как в базе‚ так и в приложении. Пример правильного заголовка в PHP:

Если уже есть «битые» данные‚ их можно восстановить с помощью CONVERT:

UPDATE numbers
SET notes = CONVERT(BINARY CONVERT(notes USING latin1) USING utf8mb4)
WHERE notes LIKE '%?%';

Резервное копирование и восстановление

5.1 Полный дамп базы

mysqldump -u user -p --default-character-set=utf8mb4 kp_archive > kp_archive;sql

5.2 Инкрементные бэкапы

Для больших архивов рекомендуется использовать binary logs и делать ежедневные полные дампы + ежечасные инкрементные.

5.3 Восстановление

mysql -u user -p --default-character-set=utf8mb4 kp_archive < kp_archive.sql

Безопасность и контроль доступа

  • Разделение прав: создайте отдельного пользователя kp_reader с правом SELECT и kp_writer с правами INSERT‚ UPDATE‚ DELETE.
  • Шифрование соединения: используйте SSL при подключении к MySQL.
  • Аудит изменений: храните историю в отдельной таблице numbers_log через триггер AFTER UPDATE.

Пример триггера аудита

CREATE TABLE numbers_log (
 log_id INT AUTO_INCREMENT PRIMARY KEY‚
 number_id INT‚
 changed_at DATETIME DEFAULT CURRENT_TIMESTAMP‚
 old_status ENUM('active'‚'blocked'‚'inactive')‚
 new_status ENUM('active'‚'blocked'‚'inactive')‚
 changed_by VARCHAR(50)
) ENGINE=InnoDB
 DEFAULT CHARSET=utf8mb4;

DELIMITER $$

CREATE TRIGGER trg_numbers_update
AFTER UPDATE ON numbers
FOR EACH ROW
BEGIN
 IF OLD.status <> NEW.status THEN
 INSERT INTO numbers_log (number_id‚ old_status‚ new_status‚ changed_by)
 VALUES (OLD.id‚ OLD.status‚ NEW.status‚ USER);
 END IF;
END$$

DELIMITER ;

Часто задаваемые вопросы (FAQ)

7.1 Как быстро проверить‚ что все записи в таблице используют правильную кодировку?

Запустите запрос‚ который ищет «неправильные» символы:

SELECT id‚ notes
FROM numbers
WHERE notes REGEXP '[^-]';

7.2 Как объединить два архива номеров‚ исключив дубли?

Используйте INSERT ... SELECT ... ON DUPLICATE KEY UPDATE при наличии уникального индекса на phone_number:

INSERT INTO numbers (phone_number‚ status‚ client_id‚ tariff_plan‚ notes)
SELECT phone_number‚ status‚ client_id‚ tariff_plan‚ notes
FROM other_archive.numbers
ON DUPLICATE KEY UPDATE
 status = VALUES(status)‚
 client_id = VALUES(client_id)‚
 tariff_plan = VALUES(tariff_plan)‚
 notes = VALUES(notes);

7.3 Как ускорить поиск по полю phone_number в таблице с миллионами записей?

Создайте покрывающий индекс и используйте EXPLAIN для проверки плана выполнения:

ALTER TABLE numbers ADD INDEX idx_phone_number (phone_number);
EXPLAIN SELECT * FROM numbers WHERE phone_number = '+7 -261234567';

7.4 Что делать‚ если в поле status появились значения‚ не входящие в ENUM?

Это может произойти после прямого изменения таблицы без проверки. Для исправления:

UPDATE numbers
SET status = 'inactive'
WHERE status NOT IN ('active'‚'blocked'‚'inactive');

Лучшие практики

  • Всегда храните номера в международном формате (+7XXXXXXXXXX)‚ это упрощает интеграцию с внешними сервисами.
  • Используйте utf8mb4 – единственная кодировка‚ поддерживающая все символы Unicode.
  • Регулярно проверяйте целостность данных (уникальность номеров‚ корректность статусов).
  • Автоматизируйте бэкапы: минимум один полный дамп в сутки + инкрементные каждые 2–4 часа.
  • Внедрите журналирование изменений – это поможет быстро отследить причины ошибок.
  • При импорте больших файлов разбивайте их на части (по 100 000 строк) и используйте LOAD DATA вместо одиночных INSERT.

КП архив номеров – это фундаментальная часть любой современной телефонной или колл‑центр системы. Правильный дизайн таблиц‚ строгая работа с кодировками и продуманные процедуры резервного копирования позволяют поддерживать архив в стабильном и безопасном состоянии‚ а также быстро находить нужные данные.

Следуя рекомендациям‚ изложенным в этой статье‚ вы сможете:

  • Создать надёжный и масштабируемый архив номеров;
  • Обеспечить корректную работу с русскими символами;
  • Оптимизировать поиск и обработку больших объёмов данных;
  • Гарантировать безопасность и аудит всех изменений.

Если у вас возникли дополнительные вопросы‚ не стесняйтесь обращаться к специалистам по базам данных или к сообществу разработчиков вашей КП‑платформы.