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

🐛 Типичные ошибки

⚡ Кратко: ошибки

  • Деньги хранить в 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;