Как изменить индексированный 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
).