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

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

我们有一个只有一列的myisam表 bit 两行,包括 0 以及 1 . 我们按此列分组,进行计数并选择它。预期结果如下。

  1. select count( bit), bit from tab GROUP BY bit;
  2. | count(bit) | bit |
  3. |------------|-----|
  4. | 1 | 0 |
  5. | 1 | 1 |

但是当使用 distinct 关键字,列的输出值总是 1 . 为什么?

  1. select count(distinct bit), bit from tab GROUP BY bit;
  2. | count(bit) | bit |
  3. |------------|-----|
  4. | 1 | 1 | # WHYYY
  5. | 1 | 1 |

我一直在抓取文件和互联网,但没有运气。以下是设置:

  1. CREATE TABLE `tab` (
  2. `bit` bit(1) NOT NULL
  3. ) ENGINE=MyISAM DEFAULT CHARSET=utf8; # When using InnoDB everything's fine
  4. INSERT INTO `tab` (`bit`) VALUES
  5. (CONV('1', 2, 10) + 0),
  6. (CONV('0', 2, 10) + 0);

附言:还有一件事。我一直在做几个实验。使用 group_concat ,列 bit 重新独立。

  1. select count(distinct bit), group_concat(bit) from tab GROUP BY bit;
  2. | count(bit) | bit |
  3. |------------|------------|
  4. | 1 | 1 byte (0) |
  5. | 1 | 1 byte (1) |
pbgvytdp

pbgvytdp1#

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

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

相关问题