当按位分组并选择不同的值时,myisam中出现意外结果

7lrncoxx  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(353)

我们有一个只有一列的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);

附言:还有一件事。我一直在做几个实验。使用 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) |
pbgvytdp

pbgvytdp1#

多亏了这些评论,从现在起,我确信不再使用bit列。更可靠的选择是 tinyint(1) .
受adminer应用程序位处理的启发,我建议使用 bin 函数在每次选择时将位转换为期望值:

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

相关问题