З цією проблемою ми стикалися, намагаючись додати UNIQUE індекс до поля VARCHAR (255) за допомогою utf8mb4. Хоча проблема тут уже добре окреслена, я хотів додати кілька практичних порад щодо того, як ми це розібрали та вирішили.
Під час використання utf8mb4 символи розраховуються як 4 байти, тоді як під utf8 вони можуть бути 3 байтами. Бази даних InnoDB мають обмеження, що індекси можуть містити лише 767 байт. Отже, використовуючи utf8, ви можете зберігати 255 символів (767/3 = 255), але використовуючи utf8mb4, ви можете зберігати лише 191 символ (767/4 = 191).
Ви абсолютно можете додати звичайні індекси для VARCHAR(255)
полів, використовуючи utf8mb4, але те, що відбувається - розмір індексу скорочується на 191 символ автоматично - як unique_key
тут:
Це добре, адже звичайні індекси просто використовуються для швидшого пошуку MySQL за вашими даними. Не потрібно індексувати все поле.
Отже, чому MySQL обрізає індекс автоматично для звичайних індексів, але видає явну помилку, намагаючись зробити це для унікальних індексів? Ну а для того, щоб MySQL міг зрозуміти, чи є введене чи оновлене значення вже існує, воно має фактично індексувати ціле значення, а не лише його частину.
Зрештою, якщо ви хочете мати унікальний індекс на полі, весь вміст поля повинен вміщуватися в індекс. Для utf8mb4 це означає зменшити довжину поля VARCHAR до 191 символу або менше. Якщо вам не потрібна utf8mb4 для цієї таблиці або поля, ви можете повернути її до utf8 і мати змогу зберегти свої поля довжиною 255.