Как я могу изменить индексированный 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).
2 ответа
Я думаю, что это связано с максимальной длиной данных строки, есть такое ограничение, по крайней мере для строковых типов данных, как я знаю. Чтобы избежать этого, попробуйте разделить данные таблицы, например разбить таблицу на две таблицы, используя отношение один к одному.
О максимальной длине ключа: я попытался создать таблицу с индексированными utf8mb4
поле было успешно создано с длиной ключа 191, но когда я установил его на 192, он выдал ошибку - указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт.
Я закончил тем, что удалил индекс.
Если на производительность негативно влияют, я могу добавить второй индексированный столбец, который содержит только первый n
символы (до 191, но, вероятно, всего 10-20 или около того) текущего столбца.
Ограничение в 191 символ из-за максимальной длины ключа 767 байтов. Для 4-байтового символа это означает максимум 191 символов (floor(767/4) = 191
).