Это ограничение MySQL InnoDB, а не PHP.Вы можете обойти ограничение только с помощью кода или потенциально увеличить предел с помощью параметра базы данных.
Проблема связана с вашим индексом на slug
.slug
определяется как 255 символов, и вы используете utf8mb4, который использует 4 байта на символ, поэтому для индекса slug
потребуется 1020 байтов.
Существует несколько вариантов обхода.
1.Уменьшите размер вашего поля.
Вместо того, чтобы вводить slug
255 символов, сделайте его 191. 191 * 4 = 764 <767. Это можно сделать, указав длину поля в своей миграции илине указав длину и настройку <code>\Illuminate\Support\Facades\Schema::defaultStringLength(191);, как указано другими.
2.Уменьшите размер вашего индекса.
Вы можете оставить размер своего поля равным 255, но скажите MySQL индексировать только первые 191 символ.Я не знаю, поддерживают ли миграции Laravel это, но вы всегда можете попробовать.
$table->index('slug(191)');
3.Включите параметр базы данных innodb_large_prefix
с форматами строк DYNAMIC.
Параметр базы данных innodb_large_prefix
увеличивает ограничение длины ключа до 3072 байтов.Однако этот параметр влияет только на таблицы с форматом строки DYNAMIC или COMPRESSED.
Если вы используете MySQL> = 5.7.7, опция innodb_large_prefix
включена по умолчанию.
Если вы используете MySQL> = 5.7.9, формат строки по умолчанию - DYNAMIC, а опция innodb_large_prefix
включена по умолчанию, поэтому у вас не возникнет этой проблемы, если вы не измените настройки по умолчанию.
Если вы используете MySQL <5.7.9, по умолчанию используется формат строки COMPACT, поэтому вам нужно будет выяснить, как указать Laravel использовать формат строки DYNAMIC.Если вы хотите сделать это для всех таблиц, вы можете установить <code>'engine' => 'InnoDB ROW_FORMAT=DYNAMIC', в вашей конфигурации базы данных.Если вы хотите сделать это только для одной таблицы, вам нужно запустить необработанные операторы DB create в вашем файле миграции.
Ссылки:
MySQL создать документацию индекса - информация оразмер ключа, форматы строк и частичные индексы
MySQL опция innodb_large_prefix
MySQL опция innodb_default_row_format