To MySQL, because 2
is neither 1
nor 0
, then 2
is neither TRUE
nor FALSE
. Consider:
SELECT 2 = TRUE, 2 = FALSE;
This returns:
| 2 = TRUE | 2 = FALSE |
| -------- | --------- |
| 0 | 0 |
You would need to express the condition differently, like:
SELECT data FROM table WHERE active > 0
This will also work (any non-zero value is considered true, see further):
SELECT data FROM table WHERE active;
This behavior is documented in the manual, which states:
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 |
+--------------------------------+