Миграция Laravel: уникальный ключ слишком длинный, даже если указан

Я пытаюсь перенести таблицу пользователей в Laravel. Когда я запускаю миграцию, я получаю эту ошибку:

[Illuminate \ Database \ QueryException] SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1071 Указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт (пользователи SQL: alter table добавляют уникальные users_email_uniq ( email ))

моя миграция выглядит следующим образом:

 Schema::create('users', function(Blueprint $table) { $table->increments('id'); $table->string('name', 32); $table->string('username', 32); $table->string('email', 320); $table->string('password', 64); $table->string('role', 32); $table->string('confirmation_code'); $table->boolean('confirmed')->default(true); $table->timestamps(); $table->unique('email', 'users_email_uniq'); }); по Schema::create('users', function(Blueprint $table) { $table->increments('id'); $table->string('name', 32); $table->string('username', 32); $table->string('email', 320); $table->string('password', 64); $table->string('role', 32); $table->string('confirmation_code'); $table->boolean('confirmed')->default(true); $table->timestamps(); $table->unique('email', 'users_email_uniq'); }); 

После некоторого googling я наткнулся на этот отчет об ошибке, где Тейлор говорит, что вы можете указать индексный ключ как второй параметр unique() , который я сделал. Он все еще дает ошибку. Что здесь происходит?

Укажите меньшую длину для вашего электронного письма:

 $table->string('email', 250); 

Фактически это значение по умолчанию:

 $table->string('email'); 

И ты должен быть хорошим.

Для Laravel 5.4 вы можете найти решение в этом Laravel 5.4: Указанный ключ был слишком длинной ошибкой, сообщение Laravel News :

Как указано в руководстве по миграции, чтобы исправить это все, что вам нужно сделать, это отредактировать файл AppServiceProvider.php и внутри метода загрузки установить длину строки по умолчанию:

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

Обновление 1

Начиная с Laravel 5.4 эти изменения больше не нужны.

Laravel 5.4 использует набор символов utf8mb4 по умолчанию, который включает в себя поддержку для хранения «emojis» в базе данных. Если вы обновляете свое приложение из Laravel 5.3, вам не нужно переключаться на этот набор символов.

Обновление 2

Текущие версии версий MariaDB НЕ поддерживают этот параметр по умолчанию по всему миру. Он реализован в MariaDB 10.2.2+ по умолчанию .

Решение

И если вы намеренно хотите использовать правильное будущее-умолчанию (начиная с Laravel 5.4), многобайтная поддержка UTF8 utf8mb4 для 😀, тогда начните исправлять 😂 конфигурацию вашей базы данных.

В Laravel config/database.php определите:

 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'engine' => 'InnoDB ROW_FORMAT=DYNAMIC', 

DYNAMIC позволяет хранить индексы с длинными ключами .

Настройки сервера (по умолчанию включены в MySQL 5.7.7+ / MariaDB 10.2.2+):

 [mysqld] # default character set and collation collation-server = utf8mb4_unicode_ci character-set-server = utf8mb4 # utf8mb4 long key index innodb_large_prefix = 1 innodb_file_format = barracuda innodb_file_format_max = barracuda innodb_file_per_table = 1 

Для клиентов:

 [mysql] default-character-set=utf8mb4 

И затем остановите свой сервер MySQL / MariaDB. После этого СНВ. Горячий RESTART может не работать.

 sudo systemctl stop mysqld sudo systemctl start mysqld 

Теперь у вас есть Laravel 5.x с поддержкой UTF8.

Если вы на или обновлены до Laravel 5.4, это сработало для меня;

Всего 1 изменение. в AppServiceProvider.php

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

Как упоминалось в руководстве по миграции https://laravel.com/docs/master/migrations#creating-indexes

Если кто-то еще наткнется на этот ответ, как я, но по другой причине, вы можете проверить свою кодировку / сопоставление в Laravel DB.

Я устанавливал приложение (Snipe-IT) и настраивал конфигурацию базы данных Laravel для использования следующего:

 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', 

Удаление mb4 из обеих строк исправило проблему, хотя я считаю, что ответ Антонио – это реальное решение проблемы.

Это сработало для меня:

  $table->charset = 'utf8'; $table->collation = 'utf8_unicode_ci'; 

Для laravel 5.4 просто отредактируйте файл

App \ Providers \ AppServiceProvider.php

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

Удалите mb4 из charset и сортировки из config / database.php, затем он будет успешно выполнен.
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

Я столкнулся с той же проблемой и исправил ее, добавив следующие две строки в мое приложение / database.php

 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 

Мой файл выглядит следующим образом:

 <?php return [ /* |-------------------------------------------------------------------------- | Default Database Connection Name |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish | to use as your default connection for all database work. Of course | you may use many connections at once using the Database library. | */ 'default' => env('DB_CONNECTION', 'mysql'), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', ...... 

У меня была такая же проблема, и я использую wamp

Открыть файл: config / database.php

 'engine' => null, => 'engine' => 'InnoDB', 

благодаря

В файле config / database.php где:

 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 

Измените эту строку следующим образом:

 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 

Я добавил к самой миграции

 Schema::defaultStringLength(191); Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); 

да, я знаю, что мне нужно учитывать это при каждой миграции, но я предпочел бы, чтобы это было спрятано у какого-то совершенно несвязанного поставщика услуг

Измените charset на «utf8mb4» на «utf8» и

сопоставление с 'utf8mb4_unicode_ci' до 'utf8_unicode_ci'

в файле config / database.php

Это сработало для меня.

Это потому, что Laravel 5.4 использует utf8mb4, который поддерживает сохранение emojis.

Добавьте это в свое приложение \ Providers \ AppServiceProvider.php

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

и вам должно быть хорошо идти.

У вас не будет этой проблемы, если вы используете MySQL 5.7.7+ или MariaDB 10.2.2+.

Чтобы обновить MariaDB на вашем Mac, используя Brew, сначала отмените текущую brew unlink mariadb : brew unlink mariadb а затем установите dev один с помощью brew install mariadb --devel

После завершения установки остановить / запустить запущенную службу: brew services stop mariadb brew services start mariadb

Текущая версия версии 10.2.3. По завершении установки вам больше не придется об этом беспокоиться, и вы можете использовать utf8mb4 (теперь это значение по умолчанию в Laravel 5.4), не переходя к utf8 и не редактируя AppServiceProvider, как это предлагается в документации Laravel: https: // laravel .com / docs / master / релизы # laravel-5.4 (прокрутите вниз до: Migration String Length )

Просто установлен MariaDB 10.2.4 RC, запускается новый пустой проект Laravel 5.4 и миграция по умолчанию (столбцы varchar (255)).

Не нужно изменять DB conf и config/database.php Laravael config/database.php . Таким образом, как @scorer отметил поведение по умолчанию для 10.2.2+.

Laravel использует utf8mb4 символов utf8mb4 по умолчанию, который включает в себя поддержку для хранения «emojis» в базе данных. Если вы используете версию MySQL старше версии 5.7.7 или MariaDB старше версии 10.2.2, вам может потребоваться вручную настроить длину строки по умолчанию, сгенерированную миграциями, чтобы MySQL создавал для них индексы. Вы можете настроить это, вызывая метод Schema::defaultStringLength в вашем AppServiceProvider :

 use Illuminate\Support\Facades\Schema; /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); } 

Вы можете проверить

https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes

включить эту строку наверху

используйте Illuminate \ Support \ Facades \ Schema;

то внутри функции загрузки добавьте это

Схема :: defaultStringLength (191);

Если вы обновлены или обновлены до версии Laravel 5.4 и последней версии, она работает;
Всего 1 изменение в AppServiceProvider.php

 use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }