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);
}
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
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 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
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 mysqld
sudo systemctl start mysqld
Now you have Laravel 5.x with UTF8 support.