Mariadb: Группировка не удалась с помощью смайликов в varchar (255) COLLATE utf8mb4_unicode_ci column - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть таблица с смайликами, подобная этой:

MariaDB> SELECT HEX(value), value FROM `emojis`;
+----------------------------+-------+
| HEX(value)                 | value |
+----------------------------+-------+
| F09F9AA9                   | ?     |
| F09F8FB4                   | ?     |
| E29C94EFB88F               | ✔️    |
| F09F9AA9                   | ?     |
| F09F8FB4                   | ?‍♀️     |
| F09FA79BE2808DE29980EFB88F | ?  |
+----------------------------+-------+

Но когда я добавляю группу, некоторые значения не возвращаются:

MariaDB> SELECT value, HEX(value) FROM `emojis` GROUP BY value;
+-------+----------------------------+
| value | HEX(value)                 |
+-------+----------------------------+
| ✔️     | E29C94EFB88F               |
| ?‍♀️    | F09F9AA9                   |
| ?    | F09FA79BE2808DE29980EFB88F |
+-------+----------------------------+

Черный флаг и kiss отсутствуют. Похоже, MariaDB не может сделать группу с UTF8 MB4 символами.

Мой тип столбца: varchar (255) COLLATE utf8mb4_unicode_ci DEFAULT NULL;

Я пробовал с Mariadb 10.1 и 10.5, и получил тот же результат.

Это ошибка или я что-то упустил?

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

HEX не является агрегатной функцией, поэтому вы не можете использовать ее как GROUP BY. Если вы хотите sh, чтобы получить разные эмодзи и соответствующие шестнадцатеричные значения, используйте DISTINCT.

Вы должны (см. Веса сопоставления символов) хранить эмодзи как utf8mb4_bin вместо utf8mb4_unicode_ci. Причина этого в том, как определяется вес персонажа. См. Обработку сравнения символов с функцией WEIGTH_STRING .

SELECT DISTINCT value, HEX(value) 
FROM emojis;

См. db-fiddle

Подобный запрос не должен использоваться :

SELECT value
FROM emojis
GROUP BY value;

GROUP BY следует использовать только при смешивании обычных столбцов с агрегатными функциями. Как сказано, вместо этого используйте DISTINCT.

0 голосов
/ 30 апреля 2020

Благодаря вашим ответам я понимаю, какую разницу имеет использование utf8mb4_bin или utf8mb4_unicode_ci при использовании DISTINCT или GROUP BY и других функций, сравнивающих строки.

Но в моем случае я не смог измените кодировку моего столбца, но я узнал, что параметры сортировки могут быть указаны в запросе, например:

SELECT id, value
FROM `emojis`
GROUP BY value COLLATE utf8mb4_bin;

Внимание, это не работает, если sql_mode равно ONLY_FULL_GROUP_BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...