Выбирайте наименьший тип, который корректно вмещает каждое значение, которое вы когда-либо будете хранить. Правильный тип экономит место на диске, уменьшает индексы и предотвращает незаметное повреждение данных.
Выбирайте наименьший тип, который корректно вмещает каждое значение, которое вы когда-либо будете хранить. Правильный тип экономит место на диске, уменьшает индексы и предотвращает незаметное повреждение данных.
INT (4 байта) для большинства id; BIGINT (8 байт) только когда вы действительно перерастаете ~2,1 миллиарда.DECIMAL(10,2) для денег — никогда FLOAT/DOUBLE, которые округляют в двоичной форме и теряют копейки.VARCHAR(n) для ограниченного текста (имена, email); n — это верхняя граница, а хранится только то, что вы используете.TEXT для больших блобов (статьи) — он хранится вне страницы и не может иметь значения по умолчанию; не используйте его для коротких значений, по которым вы фильтруете.DATETIME (без часового пояса, 8 байт) против TIMESTAMP (с преобразованием в UTC, 4 байта, ограничение ~2038 года).CREATE TABLE payments (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
amount DECIMAL(10,2) NOT NULL, -- точные деньги, не FLOAT
currency CHAR(3) NOT NULL, -- всегда 3 символа -> фиксированный CHAR
note VARCHAR(255), -- ограниченный, индексируемый
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Ловушка: SQL-режим по умолчанию отклоняет некорректные значения (хорошо) --
INSERT INTO payments (amount) VALUES ('abc'); -- ERROR 1366, а не незаметно 0
FLOAT для денег.VARCHAR(255) везде по привычке — раздутые ключи раздувают индексы.UNSIGNED на id/счётчиках, которые никогда не бывают отрицательными (удваивает положительный диапазон).Типы данных — это самое дешёвое решение по корректности и производительности, которое вы принимаете, и самое трудное для изменения впоследствии: узкие, точные типы сохраняют индексы маленькими и останавливают плохие данные на пороге, прежде чем они станут багом на проде.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать