MySQL tinyint для логического - PullRequest
       31

MySQL tinyint для логического

1 голос
/ 27 марта 2019

Итак, в моей базе данных есть столбец типа данных tinyint, в котором хранятся значения от 0 до 2.

Насколько я понимаю, MySQL рассматривает любое ненулевое число в столбце tinyint как истинное (в данном случае 1 и 2), а 0 - как ложное. Однако, когда я выполняю запрос, который извлекает определенную информацию из таблицы, где строка tinyint равна true, он работает только для строк, которые имеют 1 в качестве значения. Другими словами, строки, которые имеют 2 в качестве значения, не рассматриваются как true в запросе (а 0 рассматривается как false). Запрос будет выглядеть примерно так:

SELECT data FROM table WHERE active=true

Где active имеет тип данных tinyint, и ему ранее были присвоены значения 0, 1 или 2 в зависимости от случая.

Я довольно новичок в MySQL, поэтому я не знаю, есть ли здесь какая-то деталь, которую я мог бы упустить, но я не могу понять, почему он не возвращает запрошенные данные в строках со значением 2 в качестве значения , Любые мысли могут помочь здесь.

1 Ответ

4 голосов
/ 27 марта 2019

Для MySQL, поскольку 2 не является ни 1, ни 0, тогда 2 не является ни TRUE, ни FALSE.Рассмотрим:

SELECT 2 = TRUE, 2 = FALSE;

Возвращает:

| 2 = TRUE | 2 = FALSE |
| -------- | --------- |
| 0        | 0         |

Вам нужно будет выразить условие по-другому, например:

SELECT data FROM table WHERE active > 0

Это также будет работать (любой-нулевое значение считается истинным, см. далее):

SELECT data FROM table WHERE active;

Это поведение задокументировано в руководстве , в котором говорится:

BOOL, BOOLEAN

Эти типы являются синонимами для TINYINT(1).Нулевое значение считается ложным.Ненулевые значения считаются истинными.

mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false                  |
+------------------------+

mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+

mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+

Однако значения TRUE и FALSE являются просто псевдонимами для 1 и 0 соответственно, как показано здесь:

mysql> SELECT IF(0 = FALSE, 'true', 'false');
+--------------------------------+
| IF(0 = FALSE, 'true', 'false') |
+--------------------------------+
| true                           |
+--------------------------------+

mysql> SELECT IF(1 = TRUE, 'true', 'false');
+-------------------------------+
| IF(1 = TRUE, 'true', 'false') |
+-------------------------------+
| true                          |
+-------------------------------+

mysql> SELECT IF(2 = TRUE, 'true', 'false');
+-------------------------------+
| IF(2 = TRUE, 'true', 'false') |
+-------------------------------+
| false                         |
+-------------------------------+

mysql> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false                          |
+--------------------------------+
...