Как сделать, чтобы булевые переменные true и false были не текстом для tinyint(1) mysql?

prostors

Client
Регистрация
16.12.2020
Сообщения
1 326
Благодарностей
51
Баллы
48
Как сделать, чтобы булевые переменные true и false были не текстом(числом?) для tinyint(1) mysql?

сейчас текстом и преобразовывать в 1 и 0 mysql не хочет
 

code

Administrator
Регистрация
04.06.2025
Сообщения
197
Благодарностей
87
Баллы
28
Как сделать, чтобы булевые переменные true и false были не текстом(числом?) для tinyint(1) mysql?

сейчас текстом и преобразовывать в 1 и 0 mysql не хочет
Попробуйте в запросе не оборачивать в кавычки:
TRUE / FALSE или 1 / 0.
Кавычки ('...' или "...") превращают значение в строку

Также важно отметить, что все переменные в ZP - это тип string, из-за чего иногда данные нужно конвертировать в другие типы, если работаете из кода.



Markdown (GitHub flavored):
Коротко: **в 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)`.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 326
Благодарностей
51
Баллы
48
Также важно отметить, что все переменные в ZP - это тип string, из-за чего иногда данные нужно конвертировать в другие типы, если работаете из кода.
я работаю из действия
 

code

Administrator
Регистрация
04.06.2025
Сообщения
197
Благодарностей
87
Баллы
28

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)