@Dmax99

Какой должен быть тип строки в БД для номера телефона, состоящего из одних цифр?

Есть строка в таблице phone, туда попадают номера в виде (000)-00-00-000. Есть ли возможность, чтобы БД почистила ненужные знаки при их попадании? Нужно, чтобы номер попадал туда в формате 0000000000.
Маску ввода номера на сайте отключить или изменить не могу.
  • Вопрос задан
  • 270 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Насколько я понимаю, надо не только чистить для сохранения и последующего удобного использования, но и возвращать их на место при передаче данных обратно на сайт для отображения или корректировки, верно?

Если так, то предлагаю с самим полем ничего не делать, пусть себе будет текстовое и со всякой фигнёй. А для использования создать ещё одно, вычисляемое, поле, в которое класть очищенное и приведённое к числовому значение.

Т.е. если сейчас имеется
CREATE TABLE users (
    ...
    phone VARCHAR(255),
    ....
);

то выполняем
ALTER TABLE users ALGORITHM = INPLACE
    ADD COLUMN phone_num BIGINT UNSIGNED AS (REGEXP_REPLACE(phone, '[^0-9], ''')) VIRTUAL,
    INDEX idx_phone_num (phone_num);


Что это даёт?

Выражение вычисляемого поля чистит строковое значение от всего, что не цифра, после чего значение преобразуется в тип данных поля, т.е. BIGINT UNSIGNED. Отлично, число получено.

Поле объявлено как VIRTUAL. Это означает, что его значение не хранится в таблице, а вычисляется каждый раз, когда оно потребуется. Но мы создаём по этому полю индекс. Соответственно сервер может не вычислять значение, а извлечь его из индекса. Ещё лучше, если это поле будет включено в композитные индексы вместо поля phone - тогда вероятность, что сервер будет извлекать значение из индекса, увеличится.

Конечно, можно было бы сделать поле STORED и не морочиться с индексом. Но тогда процесс изменения структуры таблицы будет достаточно длительным, потому что такая операция не может быть INPLACE и требует COPY. Впрочем, это может оказаться более подходящим в определённых условиях.

Да, следует помнить, что в это поле нельзя записывать значения ни при INSERT, ни при UPDATE - такая операция приведёт к ошибке. Так что про запросы без указания списка полей придётся забыть... ну и SELECT * - тоже забыть.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
То что вы хотите не является задачей базы данных. Эта работа должна выполнятся в коде программы предшествующем сохранению в базу
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Какой должен быть Тип строки БД только для чисел?
Предполагаю что имелось в виду "какой тип данных использовать для ячейки, для хранения чисел в формате 0000000000?". Скорее всего вам придется использовать варчар, так как нули в начале строки при преобразовании в число у вас тупо проигнорируются.

но туда попадают номера в виде (000)-00-00-000
Плохо

Но маску ввода номера на сайте отключить или изменить не могу
И не надо, это не на форнте решать нужно. Это решается средствами серверного языка, нода, пых, короче ПЕРЕД занесением данных в бд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы