MySQL tinid 布尔值
MySQL tinyint to boolean
所以我的数据库中有一个 tinyint
数据类型列,我在其中存储从 0
到 2
的值。
据我了解,MySQL 将 tinyint
列中的任何非零数字视为真(在本例中为 1
和 2
)并且 0
为假。但是,当我执行从 table 中检索某些信息的查询时,其中 tinyint
行是 true
,它仅适用于具有 1
作为值的行。换句话说,具有 2
作为值的行不会被查询视为 true
(并且 0
被视为 false
)。查询会是这样的:
SELECT data FROM table WHERE active=true
其中 active
的数据类型为 tinyint
,并且之前已根据情况为其分配了 0
、1
或 2
的值。
我是 MySQL 的新手,所以我不知道这里是否遗漏了一些细节,但我不明白为什么它没有返回请求的数据以 2 作为值的行。任何想法都可以在这里提供帮助。
到MySQL,因为2
既不是1
也不是0
,那么2
既不是TRUE
也不是FALSE
].考虑:
SELECT 2 = TRUE, 2 = FALSE;
这个returns:
| 2 = TRUE | 2 = FALSE |
| -------- | --------- |
| 0 | 0 |
您需要以不同的方式表达条件,例如:
SELECT data FROM table WHERE active > 0
这也有效(任何非零值都被认为是真实的,请参阅下文):
SELECT data FROM table WHERE active;
此行为是 documented in the manual,其中指出:
BOOL, BOOLEAN
These types are synonyms for TINYINT(1)
. A value of zero is considered false. Nonzero values are considered true.
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 |
+------------------------+
However, the values TRUE
and FALSE
are merely aliases for 1 and 0, respectively, as shown here:
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 |
+--------------------------------+
所以我的数据库中有一个 tinyint
数据类型列,我在其中存储从 0
到 2
的值。
据我了解,MySQL 将 tinyint
列中的任何非零数字视为真(在本例中为 1
和 2
)并且 0
为假。但是,当我执行从 table 中检索某些信息的查询时,其中 tinyint
行是 true
,它仅适用于具有 1
作为值的行。换句话说,具有 2
作为值的行不会被查询视为 true
(并且 0
被视为 false
)。查询会是这样的:
SELECT data FROM table WHERE active=true
其中 active
的数据类型为 tinyint
,并且之前已根据情况为其分配了 0
、1
或 2
的值。
我是 MySQL 的新手,所以我不知道这里是否遗漏了一些细节,但我不明白为什么它没有返回请求的数据以 2 作为值的行。任何想法都可以在这里提供帮助。
到MySQL,因为2
既不是1
也不是0
,那么2
既不是TRUE
也不是FALSE
].考虑:
SELECT 2 = TRUE, 2 = FALSE;
这个returns:
| 2 = TRUE | 2 = FALSE |
| -------- | --------- |
| 0 | 0 |
您需要以不同的方式表达条件,例如:
SELECT data FROM table WHERE active > 0
这也有效(任何非零值都被认为是真实的,请参阅下文):
SELECT data FROM table WHERE active;
此行为是 documented in the manual,其中指出:
BOOL, BOOLEAN
These types are synonyms for
TINYINT(1)
. A value of zero is considered false. Nonzero values are considered true.
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 |
+------------------------+
However, the values
TRUE
andFALSE
are merely aliases for 1 and 0, respectively, as shown here:
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 |
+--------------------------------+