Коротко: **в MySQL нет отдельного типа BOOLEAN** — `BOOLEAN/BOOL` это синоним `TINYINT(1)`.
Записывайте **`TRUE`/`FALSE` без кавычек** или **`1`/`0`**. Строки `'true'`/`'false'` — это текст, и в строгом режиме MySQL даёт ошибку *Incorrect integer value*, а без него обе строки превращаются в `0`.
### Как правильно
**SQL‑литералы (без кавычек):**
```sql
INSERT INTO users (is_active) VALUES (TRUE), (FALSE);
UPDATE users SET is_active = TRUE WHERE id = 123;
```
**Числа:**
```sql
INSERT INTO users (is_active) VALUES (1), (0);
```
**Определение колонки:**
```sql
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  is_active BOOLEAN NOT NULL DEFAULT FALSE -- т.е. TINYINT(1) DEFAULT 0
);
```
### Если у вас уже хранятся строки `'true'/'false'` и их нужно разово перевести в `0/1`
```sql
UPDATE your_table
SET is_active = (LOWER(TRIM(is_active_str)) IN ('true','t','yes','y','1'));
```
### Почему сейчас «не хочет»
* Вы, вероятно, передаёте **строки** `'true'/'false'`.
* В **STRICT**‑режиме MySQL это приводит к ошибке (*Incorrect integer value: 'true'*).
* В нестрогом режиме любая ненумерическая строка превращается в `0`.
> Отключать строгий режим ради этого не стоит — лучше отправлять правильный тип.
### Пара замечаний
* Число в `TINYINT(1)` — **не «разрядность булева»**, а историческая ширина вывода. В MySQL 8 она игнорируется; тип остаётся обычным `TINYINT`.
* Тип `BIT(1)` тоже можно использовать, но он возвращает байты (`b'0'`/`b'1'`), работать с ним в приложениях чуть менее удобно. Для логики чаще используют `TINYINT(1)`.