我们有一个MyISAM表,其中包含一列bit
和两行,其中包含0
和1
。我们按此列分组,进行计数并选择它。预计结果如下。
select count( bit), bit from tab GROUP BY bit;
| count(bit) | bit |
|------------|-----|
| 1 | 0 |
| 1 | 1 |
但是,在使用distinct
关键字时,列的输出值始终为1
。为什么呢?
select count(distinct bit), bit from tab GROUP BY bit;
| count(bit) | bit |
|------------|-----|
| 1 | 1 | # WHYYY
| 1 | 1 |
我一直在抓文档和互联网,但没有运气。 这是设置:
CREATE TABLE `tab` (
`bit` bit(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8; # When using InnoDB everything's fine
INSERT INTO `tab` (`bit`) VALUES
(CONV('1', 2, 10) + 0),
(CONV('0', 2, 10) + 0);
PS:还有一件事。我一直在做几个实验。使用group_concat
,列bit
将再次独立。
select count(distinct bit), group_concat(bit) from tab GROUP BY bit;
| count(bit) | bit |
|------------|------------|
| 1 | 1 byte (0) |
| 1 | 1 byte (1) |
答案 0 :(得分:0)
感谢评论,我从现在开始确信根本不使用位列。更可靠的替代方案是tinyint(1)
。
受到Adminer应用程序位处理的启发,我建议每次选择时使用bin
函数将位转换为预期值:
select count(distinct bit), BIN(bit) from tab GROUP BY bit;