Занятие 09. Типы данных. Изменение типов данных
⚡ Кратко: суть темы
Занятие учит понимать типы данных в 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— момент времени с учётом временной зоны.
Булевы значения
BOOLEAN—TRUE/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, что может быть неожиданно.