因此,我在数据库中有一个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作为值返回行中的请求数据。任何想法都可以在这里有所帮助。
答案 0 :(得分:4)
对于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
这也将起作用(任何非零值都将被视为true,请进一步了解):
SELECT data FROM table WHERE active;
此行为是documented in the manual,其中指出:
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 |
+--------------------------------+