在按位分组并选择不同值时,MyISAM中出现意外结果

时间:2018-06-08 10:43:54

标签: mysql sql group-by myisam

我们有一个MyISAM表,其中包含一列bit和两行,其中包含01。我们按此列分组,进行计数并选择它。预计结果如下。

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) |

1 个答案:

答案 0 :(得分:0)

感谢评论,我从现在开始确信根本不使用位列。更可靠的替代方案是tinyint(1)

受到Adminer应用程序位处理的启发,我建议每次选择时使用bin函数将位转换为预期值:

select count(distinct bit), BIN(bit) from tab GROUP BY bit;