So I have a tinyint datatype column in my database where I store values from 0 to 2.
It is my understanding that MySQL treats any non-zero number in a tinyint column as true (in this case 1 and 2) and the 0 as false. However, when I perform a query that retrieves certain information from the table where the tinyint row is true, it only works for the rows that have 1 as the value. In other words, the rows that have 2 as a value are not seen as true by the query (and the 0 is seen as false). The query would go something like:
SELECT data FROM table WHERE active=true
Where active is of datatype tinyint and it has been previously assigned values of 0, 1 or 2 depending on the case.
I'm fairly new to MySQL, so I don't know if there's some detail that I could be missing here, but I can't figure out why it's not returning the requested data on the rows with 2 as the value. Any thoughts could help here.
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, BOOLEANThese 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
TRUEandFALSEare 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 |
+--------------------------------+
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With