sql_mode визначає, наскільки суворо MySQL поводиться з некоректними даними. Ключовий прапорець - STRICT_TRANS_TABLES (строгий режим), увімкнений за замовчуванням з MySQL 5.7.
Без строгого режиму MySQL «виправляє» дані мовчки:
-- name VARCHAR(10), age TINYINT UNSIGNED, created_at DATE
INSERT INTO users (name, age, created_at) VALUES ('Олександра Іваненко', 300, '2026-02-30');
-- вставлено з попередженнями:
-- name = 'Олександра', age = 255, created_at = '0000-00-00'
- рядок обрізано до довжини колонки;
- число поза діапазоном замінено на межу;
- неіснуюча дата - на нульову;
- значення не того типу - на 0 чи порожній рядок.
Застосунок отримує «успіх», а в базі - зіпсовані дані, які виявляють через місяці.
Зі строгим режимом ті самі вставки - помилки, і застосунок дізнається про проблему одразу.
Інші важливі прапорці режиму за замовчуванням у MySQL 8:
ONLY_FULL_GROUP_BY- заборона неоднозначнихGROUP BY;NO_ZERO_DATE,NO_ZERO_IN_DATE- заборона «нульових» дат0000-00-00;ERROR_FOR_DIVISION_BY_ZERO- ділення на нуль при записі - помилка, а неNULL;NO_ENGINE_SUBSTITUTION- помилка замість тихої заміни рушія таблиці.
Де режим вимикають (і не варто):
'strict' => falseуconfig/database.phpLaravel - встановлює м'який режим для з'єднання застосунку. Інколи так «лікують» помилки старого коду при оновленні MySQL - і повертають тихе псування даних.- Старі дампи з
0000-00-00не імпортуються в строгому режимі - їх треба виправити, а не вимикати режим глобально.
Як перевірити:
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode;
SHOW WARNINGS; -- після операції, якщо режим м'який
Правило: строгий режим скрізь, а некоректні значення - відхиляти валідацією в застосунку з зрозумілим повідомленням, а не покладатися на те, що база їх «підправить».