MySQL tinyint 转 boolean

3

我在数据库中有一个 tinyint 数据类型列,其中存储了从 02 的值。

据我所知,MySQL 把 tinyint 列中的任何非零数字视为 true(在这种情况下是 12),而把 0 视为 false。然而,当我执行查询以从表格中检索满足 tinyint 行为 true 的特定信息时,它只适用于值为 1 的行。换句话说,具有 2 值的行不会被查询视为 true (而 0 被视为 false)。查询可能像这样:

SELECT data FROM table WHERE active=true

其中activetinyint数据类型,先前已分配值为012,具体取决于情况。

我对MySQL还比较新,因此不知道这里可能有些细节我没注意到,但我无法弄清楚为什么它不返回值为2的行上请求的数据。任何想法都可以帮助这里。

1个回答

6

对于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;

这个行为在手册中有记录,其中说明:

BOOL, BOOLEAN

这些类型是TINYINT(1)的同义词。零被视为false,非零值被视为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                   |
+------------------------+

然而,TRUEFALSE这两个值实际上只是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                          |
+--------------------------------+

SELECT data FROM table WHERE active (而不是应该)按照手册所说的工作,因为任何非零值都被视为真。您可能还想考虑添加 SELECT IF(2, 'true', 'false');SELECT IF(0, 'true', 'false'); 到您的示例中。否则,这是一个非常全面的答案,SO需要更多这样的内容... - Nick
@Nick:感谢您的积极反馈和建议!我已经相应地更新了我的答案。 - GMB
非常感谢!使用“WHERE active”而不是“WHERE active=true”完美地解决了问题。 - dmc4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接