如何让 MySQL 命令行工具默认显示存储为 BIT 的布尔值

Posted

技术标签:

【中文标题】如何让 MySQL 命令行工具默认显示存储为 BIT 的布尔值【英文标题】:How to get MySQL command line tool to show booleans stored as BIT sensibly by default 【发布时间】:2013-09-30 18:10:07 【问题描述】:

我在使用 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)中发现了一些(可能相关的)错误,但没有回答或修复?

【问题讨论】:

好点,抱歉我的问题很不清楚。目前,我们最终使用 BIT 类型来表示布尔值(使用 JPA)。 【参考方案1】:

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

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

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

但是,如果您也坚持使用SELECT *(即bad practice,尽管从命令行客户端更容易理解),您可以考虑定义一个view,其中操作被执行,然后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';

【讨论】:

好点,必须考虑清楚。是的,SELECT * 仅用于使用命令行客户端进行临时查询和调试,以便轻松了解表格内容等。 @Touko:关于将BOOLEAN与JPA一起使用,请参阅***.com/a/10224905。【参考方案2】:

有点难看,但也许有一些解决方法: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              |
+--------------------------------------+---------------+----------------+

【讨论】:

以上是关于如何让 MySQL 命令行工具默认显示存储为 BIT 的布尔值的主要内容,如果未能解决你的问题,请参考以下文章

DOS命令行窗口mysql中文显示乱码问题解决方法

mysql数据库表里中文乱码应该选哪种编码?

db2如何创建存储过程

mysql默认最大显示条数是1000行,如何修改这个设置,让它显示2000行? 最好有步骤,先谢谢啦!

在SQL2008和2012里面怎么让显示全部行和编辑 全部而不是200和1000

mysql命令行批量插入100条数据命令