Неожиданный результат в MyISAM при группировании по битам и выборе разных значений - PullRequest
0 голосов
/ 08 июня 2018

У нас есть таблица 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) |

1 Ответ

0 голосов
/ 08 июня 2018

Благодаря комментариям я отныне убежден, что битовый столбец вообще не используется.Более надежной альтернативой является tinyint(1).

Вдохновленный обработкой битов приложения Adminer, я рекомендую использовать функцию bin для приведения бит к ожидаемому значению каждый раз при выборе:

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