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

prostors

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

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

code

Administrator
Регистрация
04.06.2025
Сообщения
207
Благодарностей
103
Баллы
43
Как сделать, чтобы булевые переменные 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 332
Благодарностей
51
Баллы
48
Также важно отметить, что все переменные в ZP - это тип string, из-за чего иногда данные нужно конвертировать в другие типы, если работаете из кода.
я работаю из действия
 

code

Administrator
Регистрация
04.06.2025
Сообщения
207
Благодарностей
103
Баллы
43

prostors

Client
Регистрация
16.12.2020
Сообщения
1 332
Благодарностей
51
Баллы
48

Dmitriy_Zenno

Administrator
Регистрация
28.10.2025
Сообщения
51
Благодарностей
21
Баллы
8
INSERT INTO test (isTrue) VALUES (@isTrue)
в параметре @isTrue переменная {-Variable.isTrue-} в ней прописано True
Здравствуйте,

Я немного разобрался в данном вопросе и понял. Вам в запросе нужно отправлять не true или false, а 1 или 0.

Ваше значение в переменной {-Variable.isTrue-} должно быть не “True”, а “1”. То есть перед отправкой запроса Вам нужно сделать дополнительную обработку переменной и самому изменить ее из true в 1 или 0.

Можете выполнить такой "кубик IF" {-Variable.isTrue-}==True если Oк то передаем “1”, если нет то “0”.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 332
Благодарностей
51
Баллы
48
Можете выполнить такой "кубик IF" {-Variable.isTrue-}==True если Oк то передаем “1”, если нет то “0”.
ну представь, у тебя 10 таких переменных
представь 100 булевых переменных
представь более 100
и все эти проверки тебе прописывать руками
 

Dmitriy_Zenno

Administrator
Регистрация
28.10.2025
Сообщения
51
Благодарностей
21
Баллы
8
ну представь, у тебя 10 таких переменных
представь 100 булевых переменных
представь более 100
и все эти проверки тебе прописывать руками
Соглашусь, что на обычных кубиках данная проверка очень проблематична, если нужно делать много проверок.
Но Вы должны понимать, что tinyint в mysql ожидает 1 или 0 и эту ответственность должен взять на себя разработчик.

Чтобы облегчить вам эту проверку, написал для вас небольшой C# сниппет, который будет выполнять проверку булевых значений переменной isTrue и изменить переменную для отправки tinyint. Вам нужно только добавить переменную tinyint. И в БД отправлять значение из переменной tinyint

C#:
var isTrue = Convert.ToBoolean(project.Variables["isTrue"].Value);

if (isTrue)
    project.Variables["tinyint"].Value = "1";
else project.Variables["tinyint"].Value = "0";
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 332
Благодарностей
51
Баллы
48

prostors

Client
Регистрация
16.12.2020
Сообщения
1 332
Благодарностей
51
Баллы
48
я прошу добавить булевый тип к переменным, а вы мне код для проверок присылаете, обратите на это внимание
 

Dmitriy_Zenno

Administrator
Регистрация
28.10.2025
Сообщения
51
Благодарностей
21
Баллы
8
я прошу добавить булевый тип к переменным, а вы мне код для проверок присылаете, обратите на это внимание
В ZennoPoster все переменные текстовые, поэтому здесь такое преобразование нужно делать вручную.
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 332
Благодарностей
51
Баллы
48
В ZennoPoster все переменные текстовые, поэтому здесь такое преобразование нужно делать вручную.
Я знаю, что они текстовые, знаю, что доработать будет сложно.
Но это нужно сделать.
 

code

Administrator
Регистрация
04.06.2025
Сообщения
207
Благодарностей
103
Баллы
43
Я знаю, что они текстовые, знаю, что доработать будет сложно.
Но это нужно сделать.
К сожалению, на данный момент это решение, вероятнее всего, находится в очереди на решение, но я не могу обещать, что оно будет реализовано в ближайшее время.

На данный момент вы можете реализовать так, как вам предложил Дмитрий, или я в ответе под спойлером. Там есть конвертация в запросе SQL.
 
  • Спасибо
Реакции: Dmitriy_Zenno

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