← К оглавлению занятия

Занятие 09. Типы данных. Изменение типов данных

📁 Блок: SQL / MySQL ⏱️ Время изучения: ~60 мин 🎯 Сложность: Начальная
#decimal #float #varchar #time #datetime #timestamp #signed #unsigned #char #date #binary #int #cast

⚡ Кратко: суть темы

Занятие учит понимать типы данных в SQL и явно преобразовывать их. Разбираем числовые, строковые, временные и булевы типы, а также функцию CAST.

  • Тип данных определяет, какие операции можно выполнять со столбцом.
  • CAST(expression AS type) — явное преобразование типа.
  • MySQL делает скрытые преобразования, но лучше управлять ими явно.

Что запомнить: неявные преобразования удобны, но могут приводить к неожиданным результатам — используйте CAST.

Частая ошибка: складывать числа со строками без CAST и удивляться результату.

📖 Основные типы данных

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

Числовые типы

  • INT — целые числа.
  • DECIMAL(p, s) / NUMERIC(p, s) — числа с фиксированной точкой (деньги, точные расчёты).
  • FLOAT / DOUBLE — числа с плавающей точкой (приближённые вычисления).

Строковые типы

  • CHAR(n) — строка фиксированной длины.
  • VARCHAR(n) — строка переменной длины.
  • TEXT — большие текстовые блоки.

Дата и время

  • DATE — дата.
  • TIME — время.
  • DATETIME — дата и время.
  • TIMESTAMP — момент времени с учётом временной зоны.

Булевы значения

  • BOOLEANTRUE / FALSE. В MySQL часто хранится как TINYINT(1): 1 = true, 0 = false.

📖 Операции в зависимости от типа

ТипДоступные операцииПример
Числовые+, -, *, /, сравнениеquantity * unit_price AS total_price
Строковыеконкатенация, подстрока, регистрCONCAT(first_name, ' ', last_name)
Дата/времясравнение, извлечение частейLEFT(order_date, 7)
Булевылогические операцииWHERE is_manager = TRUE

📖 Явное преобразование типов: CAST

Функция CAST преобразует выражение в указанный тип данных.

SELECT CAST('123' AS SIGNED) AS number;

Часто используемые целевые типы в MySQL:

  • SIGNED / UNSIGNED — целые числа.
  • DECIMAL — числа с фиксированной точкой.
  • CHAR — строка.
  • DATE, TIME, DATETIME — дата и время.
  • BINARY — бинарная строка.
-- Текст в число для расчёта
SELECT product_name,
       CAST(unit_in_stock AS SIGNED) * list_price AS total_value
FROM products;

-- Число в строку для отчёта
SELECT product_name,
       CONCAT('Available: ', CAST(unit_in_stock AS CHAR),
              ' units, Price: $', CAST(list_price AS CHAR)) AS report
FROM products;

📖 Скрытые преобразования в MySQL

MySQL часто преобразует типы автоматически:

  • При арифметической операции строка с числом превращается в число.
  • При конкатенации число превращается в строку.
  • При сравнении строки и числа строка преобразуется в число.
SELECT '100' + 50 AS result;        -- 150
SELECT CONCAT('Total: ', 150) AS msg; -- 'Total: 150'
SELECT * FROM products WHERE unit_in_stock = '50'; -- строка -> число

Проверить по докуменментации: неявные преобразования зависят от контекста и версии СУБД. В PostgreSQL и SQL Server поведение строже: несовпадение типов часто вызывает ошибку. Для переносимых запросов используйте CAST или :: (PostgreSQL).

✨ Современные практики

  • Для денежных расчётов используйте DECIMAL, а не FLOAT.
  • Явно приводите типы перед арифметикой и конкатенацией — код становится понятнее и переносимее.
  • Проверяйте результат CAST на некорректных данных: например, CAST('abc' AS SIGNED) даст 0 в MySQL, что может быть неожиданно.