9

我在使用 MySQL 选择存储为 BIT 的布尔类型时遇到问题。我知道我可以使用自定义查询(例如使用SELECT CAST(1=1 AS SIGNED INTEGER)或使用 SELECT BOOLFIELD + 0 ...

但是,有没有办法让我们的布尔值通过命令行客户端以合理的方式显示,比如 SELECT * FROM TABLE ?

更新:目前我在结果中只看到空格示例:

mysql> SELECT distinct foo, foo + 0 from table
+------+-------+
| foo  | foo_0 |
+------+-------+
|      |     0 |  <-- Only space
|     |     1 |   <-- Space, one space less
+------+-------+

通过一些谷歌搜索,我从 MySQL 错误数据库(http://bugs.mysql.com/bug.php?id=28422、http://bugs.mysql.com/bug.php?id )中发现了一些(可能相关的)错误=43670)但不回答或修复?

4

2 回答 2

6

要存储布尔值,真的应该使用 MySQL 的BOOLEAN类型(它是 的别名TINYINT(1),因为 MySQL 没有真正的布尔类型):0 表示 false,非零表示 true。

虽然感觉在字节中存储布尔值比在BIT(1)列中更浪费,但必须记住,一些保存的位将转化为 CPU 在数据存储和检索方面的更多位操作;而且我不确定大多数存储引擎是否BIT将列填充到下一个字节边界。

如果您坚持使用BIT类型列,您应该知道它们是作为二进制字符串返回的。MySQL 命令行客户端(愚蠢地)尝试将二进制字符串呈现为文本(通过应用其默认字符集),这就是导致您观察到的行为的原因——没有办法避免这种情况(除了操纵 select 中的字段列表,以便它作为二进制字符串以外的其他内容返回,就像您已经在做的那样)。

但是,如果您还坚持使用SELECT *(这是一种不好的做法,尽管从命令行客户端更容易理解),您可能会考虑定义一个执行操作的视图,然后再SELECT从中执行操作。例如:

CREATE VIEW my_view AS SELECT foo + 0 AS foo, bar FROM my_table;

然后可以这样做:

SELECT * FROM my_view WHERE foo = 1 AND bar = 'wibble';
于 2013-09-26T06:19:36.627 回答
1

有点难看,但也许有一些解决方法:CASE WHEN ... THEN ... END

代替

> select
    guid,
    consumed,
    confirmed
  from Account
  where customerId = 'xxxx48' and name between xxxx and xxxx;
+--------------------------------------+----------+-----------+
| guid                                 | consumed | confirmed |
+--------------------------------------+----------+-----------+
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |         |          |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |         |           |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |         |           |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |         |          |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |         |           |
+--------------------------------------+----------+-----------+

可以这样做:

> select
    guid,
    case when consumed then '1' when not consumed then '0' end as been_consumed,
    case when confirmed then '1' when not confirmed then '0' end as been_confirmed
  from Account
  where customerId = 'xxxx48' and name between xxxx and xxxx;
+--------------------------------------+---------------+----------------+
| guid                                 | been_consumed | been_confirmed |
+--------------------------------------+---------------+----------------+
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 1             | 1              |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 1             | 0              |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 1             | 0              |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 1             | 1              |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 1             | 0              |
+--------------------------------------+---------------+----------------+
于 2021-03-09T11:04:33.090 回答