В SQL существует несколько основных типов данных — строковые (например, VARCHAR, CHAR, TEXT), числовые (INT, DECIMAL, FLOAT), даты и времени (DATE, TIMESTAMP). Очень важно выбирать наименьший подходящий тип для конкретных данных, чтобы экономить место и оптимизировать индексацию. Частая ошибка — выбор типа с избыточной длиной (например, VARCHAR(255) вместо VARCHAR(50)), что может привести к ненужным затратам ресурсов.
Другое важное различие — числовые типы: FLOAT хранит приближённые значения, а DECIMAL — точные, полезен для финансовых операций. Сравнение строк разных кодировок, например, может дать неожиданные результаты, если не учитывать COLLATE.
Пример:
-- Пример работы с несовместимостью типов declare @price varchar(10) = '100.99'; select @price + 1; -- Ошибка: невозможно сложить строку и число -- Без явного преобразования типов работать не будет
Вопрос: Что произойдет, если сравнить поле типа VARCHAR с числом? Например: WHERE code = 123? Будет ли работать быстро индекс?
Ответ: SQL попытается привести число к строке и сравнить как строки. Однако если по этому полю построен числовой индекс, он не будет использоваться при строковом сравнении, а запрос замедлится. Рекомендуется всегда использовать строгий тип данных и явное приведение, если нужно.
Пример:
SELECT * FROM products WHERE code = '123'; -- Индекс может использоваться SELECT * FROM products WHERE code = 123; -- Индекс НЕ используется, возможен full scan
История
VARCHAR, чтобы поддерживать разные валютные форматы. Через пару лет понадобилось сортировать товары по цене: сортировки работали некорректно, а индексация была невозможна. Понадобилась сложная миграция и приведение типов, что заняло недели.История
FLOAT для хранения сумм. При отчётах возникли расхождения из-за округлений, спустя год это привело к значительным ошибкам в распределении премий.История
В логах стартапа дата и время записывались как текст (VARCHAR). Когда понадобилось вычислять интервалы, выяснилось, что время везде было в разных форматах, и вычисления требовали трудозатратного нормализующего парсинга, что негативно сказалось на производительности.