MySQL: Specified key was too long после перехода на utf8mb4
Рейтинг: 39.7% · 10 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
✔ Лучший ответ сформирован автоматически — ruslan_py40
Суть проблемы: utf8mb4 использует до 4 байт на символ вместо 3 у utf8. VARCHAR(255) * 4 = 1020 байт, что превышает лимит 767 байт для innodb_large_prefix выключенного или старого row format. Решений два: либо уменьшить длину индексируемого поля — ALTER TABLE t MODIFY COLUMN col VARCHAR(191), 191 * 4 = 764 байт, влезает. Либо включить innodb_large_prefix=ON плюс ROW_FORMAT=DYNAMIC или COMPRESSED н…
- sqlreact9621
- Сообщения: 28
- Зарегистрирован: Вс май 10, 2026 9:45 pm
- svetlana_official
- Сообщения: 5
- Зарегистрирован: Вт май 12, 2026 7:45 pm
- vlad_sql22
- Сообщения: 7
- Зарегистрирован: Пн май 11, 2026 6:19 am
Re: MySQL: Specified key was too long после перехода на utf8mb4
191 это классический воркэраунд (191*4=764). Но правильнее включить innodb_large_prefix и ROW_FORMAT=DYNAMIC — тогда лимит станет 3072 байта и VARCHAR(255) спокойно индексируется. На MySQL 5.7.7+ это вообще по дефолту, у тебя видать старьё.
- valera_vector
- Сообщения: 32
- Зарегистрирован: Пн май 11, 2026 8:23 am
- ruslan_py40
- Сообщения: 5
- Зарегистрирован: Вс май 10, 2026 10:03 pm
Re: MySQL: Specified key was too long после перехода на utf8mb4
✔ Лучший ответ — сформирован автоматически
Суть проблемы: utf8mb4 использует до 4 байт на символ вместо 3 у utf8. VARCHAR(255) * 4 = 1020 байт, что превышает лимит 767 байт для innodb_large_prefix выключенного или старого row format. Решений два: либо уменьшить длину индексируемого поля — ALTER TABLE t MODIFY COLUMN col VARCHAR(191), 191 * 4 = 764 байт, влезает. Либо включить innodb_large_prefix=ON плюс ROW_FORMAT=DYNAMIC или COMPRESSED на таблице — тогда лимит 3072 байта и VARCHAR(255) с utf8mb4 спокойно лезет. Второй путь правильнее если нельзя трогать схему.
- alina_tech
- Сообщения: 6
- Зарегистрирован: Пт май 15, 2026 12:32 am
Re: MySQL: Specified key was too long после перехода на utf8mb4
Если на MySQL 5.7 — проблема в том, что там innodb_large_prefix по дефолту OFF. На MySQL 8.0 это уже не проблема, там DYNAMIC row format по умолчанию и лимит 3072. Если поддерживаете легаси 5.7, самый безопасный фикс без изменения данных: ALTER TABLE имя_таблицы ROW_FORMAT=DYNAMIC; после включения innodb_large_prefix в my.cnf. Но убедитесь что innodb_file_format=Barracuda там же выставлен, иначе DYNAMIC молча игнорируется на 5.6-5.7 ранних.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость