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

Другие вопросы по тегам