Laravel migration: unique key is too long, even if specified Laravel migration: unique key is too long, even if specified laravel laravel

Laravel migration: unique key is too long, even if specified


Specify a smaller length for your e-mail:

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

Which is the default, actually:

$table->string('email');

And you should be good.

For Laravel 5.4 you can find a solution in this Laravel 5.4: Specified key was too long error, Laravel News post:

As outlined in the Migrations guide to fix this all you have to do is edit your AppServiceProvider.php file and inside the boot method set a default string length:

use Illuminate\Database\Schema\Builder;public function boot(){    Builder::defaultStringLength(191);}


Update 1

As of Laravel 5.4 those changes are no more needed.

Laravel 5.4 uses the utf8mb4 character set by default, which includes support for storing "emojis" in the database. If you are upgrading your application from Laravel 5.3, you are not required to switch to this character set.

Update 2

Current production MariaDB versions DO NOT support this setting by default globally. It is implemented in MariaDB 10.2.2+ by default.

Solution

And if you intentionally want to use the correct future-default (starting from Laravel 5.4) UTF8 multi-byte utf8mb4 support for 😀 then start to fix 😂 your database configuration.

In Laravel config/database.php define:

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

DYNAMIC allows to store long key indexes.

Server settings (by default included in MySQL 5.7.7+ / MariaDB 10.2.2+):

[mysqld]# default character set and collationcollation-server = utf8mb4_unicode_cicharacter-set-server = utf8mb4# utf8mb4 long key indexinnodb_large_prefix = 1innodb_file_format = barracudainnodb_file_format_max = barracudainnodb_file_per_table = 1

For clients:

[mysql]default-character-set=utf8mb4

And then STOP your MySQL/MariaDB server. After that START. Hot RESTART may not work.

sudo systemctl stop mysqldsudo systemctl start mysqld

Now you have Laravel 5.x with UTF8 support.


If you're on or updated to Laravel 5.4 This worked for me;

Just 1 change. in AppServiceProvider.php

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

As mentioned in the migrate guide https://laravel.com/docs/master/migrations#creating-indexes