← К оглавлению занятия
⚡ Кратко: ошибки
- Деньги хранить в
FLOAT — погрешность округления.
- Полагаться на неявное преобразование строки в число.
- Игнорировать
NULL при CAST — результат может быть неожиданным.
1
Ошибка: денежные расчёты в FLOAT
Типы с плавающей точкой хранят приближённые значения, что приводит к погрешностям в денежных расчётах.
-- Неправильно: может дать 9.999999 вместо 10.00
SELECT CAST(9.99 AS FLOAT) + 0.01 AS price;
Как исправить: используйте DECIMAL.
SELECT CAST(9.99 AS DECIMAL(10, 2)) + 0.01 AS price;
2
Ошибка: неявное преобразование строки в число
MySQL может автоматически преобразовать строку в число, но если строка не содержит числа, результат будет 0.
-- Результат 0, что может быть неожиданно
SELECT CAST('abc' AS SIGNED) AS number;
Как исправить: очищайте данные перед преобразованием или используйте условную логику.
SELECT CASE
WHEN unit_in_stock REGEXP '^[0-9]+$'
THEN CAST(unit_in_stock AS SIGNED)
ELSE 0
END AS clean_stock
FROM products;
3
Ошибка: конкатенация числа без CAST
В MySQL CONCAT автоматически преобразует числа в строки, но в других СУБД это может не сработать.
-- Работает в MySQL, но лучше явно
SELECT CONCAT('Price: ', list_price) FROM products;
Как исправить:
SELECT CONCAT('Price: ', CAST(list_price AS CHAR)) FROM products;
4
Ошибка: сравнение BOOLEAN как строки
В MySQL BOOLEAN часто хранится как TINYINT(1). Сравнение со строкой 'TRUE' даст неожиданный результат.
-- Неправильно в MySQL
SELECT * FROM employees WHERE is_manager = 'TRUE';
Как исправить: сравнивайте с числом или используйте TRUE/FALSE.
SELECT * FROM employees WHERE is_manager = 1;
SELECT * FROM employees WHERE is_manager = TRUE;