weranda
@weranda

Что делать при ошибке в MySQL: «Указан слишком длинный ключ. Максимальная длина ключа составляет 1000 байт»?

Приветствую.
Понадобилось изменить кодировку таблиц БД. Делаю это вот так для конкретной таблицы:
ALTER TABLE
    table_name
    CONVERT TO CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

На нескольких таблицах появляется ошибка: "Указан слишком длинный ключ. Максимальная длина ключа составляет 1000 байт". Эмперическим путем понял, что если полю VARCHAR таблицы уменьшить значение с 255 до 249, то кодировка в БД сменится нормально.

Хотелось бы узнать, так как в БД не силен:
а) Почему так происходит?
б) Все ли будет норм, если в таблицах с ошибками при смене кодировки сменю значение на меньшее?
в) Надо ли уменьшить значение с 255 до 249 или на какое-то другое?
г) Почему в одних таблицах меняется, а в других — нет? Тех и у других есть поле VARCHAR 255.
  • Вопрос задан
  • 1627 просмотров
Решения вопроса 1
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
Все дело в том что utf8mb4_unicode_ci использует 4 байта для кодирования одного символа, плюс 1 байт хранит длину строки. Соответственно (255+1)*4 = 1024.
Уменьшит размер данных можно, и даже нужно, с учетом что текущие данные не будут повреждены. Проверить максимальную длину строки:
SELECT MAX(fieldname) FROM table;

Выбор размера данных зависит от их возможных значений. Например если поле может быть только "да", "нет" , "иногда" то достаточно varchar(6)

Кроме того если строковое поле имеет ограниченный набор значений имеет смысл использовать enum или отдельную таблицу со словарем
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Just__Den
FULL STACK
увелич рамеры ключа.

в консоли

SET GLOBAL innodb_large_prefix=on;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы