MySQL: Specified key was too long после перехода на utf8mb4
Рейтинг: 39.7% · 10 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
✔ Лучший ответ сформирован автоматически — idlebteam
Суть проблемы: 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…
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+ это вообще по дефолту, у тебя видать старьё.
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 спокойно лезет. Второй путь правильнее если нельзя трогать схему.
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
- Похожие темы
-
-
-
-
- Переехали с MySQL 8.0 на Postgres 17 и через девять дней откатились. Вскрытие
6 ответов · 44 просмотров
Похожие запросы:
что такое postgresql простыми словамибаза данных postgresql для начинающихsql запросы в postgresql для начинающихpostgresql или mysql что выбрать для проекта
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость