Как изменить индексированный varchar (255) с utf8 на utf8mb4 и по-прежнему оставаться под максимальной длиной ключа 767?

У меня есть столбец mysql, который должен поддерживать emoji, а это означает преобразование столбца utf8 в utf8mb4. Но мой varchar (255) не подходит, если столбец проиндексирован (не уникален).

Как я могу сохранить индекс и получить сортировку utf8mb4?

Я попытался просто уменьшить длину до 191, но, к сожалению, некоторые из моих строк длиннее, и я получаю эту ошибку: #1406 - Data too long for column 'column_name' at row 33565 (что не очень полезно, так как у меня нет столбца с автоматическим увеличением и не знаю, как тонкой строки 33565).

Ответ 1

Я думаю, что это связано с максимальной длиной данных строки, существует такое ограничение, по крайней мере, для строковых типов данных, как я знаю. Чтобы избежать этого, попробуйте отделить данные таблицы, например. разделите таблицу на две таблицы, используя отношения "один-к-одному".

О максимальной длине ключа: я попытался создать таблицу с индексированным полем utf8mb4, она была успешно создана с длиной ключа 191, но когда я установил ее на 192, она выдала ошибку - указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт.

Ответ 2

Я закончил удаление индекса.

Если производительность негативно сказывается, я могу добавить второй индексированный столбец, который содержит только первые n символы (до 191, но, вероятно, всего 10-20 или около того) текущего столбца.

Предел символов 191 обусловлен максимальной длиной ключа 767 байт. Для 4-байтного символа это означает максимум 191 символ (floor(767/4) = 191).