According to the official Laravel 7.x documentation, you can solve this quite easily.
Update your /app/Providers/AppServiceProvider.php
to contain:
use Illuminate\Support\Facades\Schema;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
Alternatively, you may enable the
innodb_large_prefix
option for your database. Refer to your database's documentation for instructions on how to properly enable this option.
I don't know why the above solution and the official solution which is adding
Schema::defaultStringLength(191);
in AppServiceProvider
didn't work for me.
What worked for was editing the database.php
file in config
folder.
Just edit
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
to
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
and it should work, although you will be unable to store extended multibyte characters like emoji.
This is an ugly hack and don't do if you want to store string in non english language, emoji
I did it with Laravel 5.7. Hope it helps.
Don't forget to stop and launch again the server.
I'm just adding this answer here as it's the quickest
solution for me. Just set the default database engine to 'InnoDB'
on
/config/database.php
'mysql' => [
...,
...,
'engine' => 'InnoDB',
]
then run php artisan config:cache
to clear and refresh the configuration cache
EDIT: Answers found here might explain what's behind the scenes of this one
This issue is caused in Laravel 5.4 by the database version.
According to the docs (in the Index Lengths & MySQL / MariaDB
section):
Laravel uses the
utf8mb4
character set by default, which includes support for storing "emojis" in the database. If you are running a version of MySQL older than the 5.7.7 release or MariaDB older than the 10.2.2 release, you may need to manually configure the default string length generated by migrations in order for MySQL to create indexes for them. You may configure this by calling theSchema::defaultStringLength
method within yourAppServiceProvider
.
In other words, in <ROOT>/app/Providers/AppServiceProvider.php
:
// Import Schema
use Illuminate\Support\Facades\Schema;
// ...
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
// Add the following line
Schema::defaultStringLength(191);
}
// ...
}
But as the comment on the other answer says:
Be careful about this solution. If you index email fields for example, stored emails can only have a max length of 191 chars. This is less than the official RFC states.
So the documentation also proposes another solution:
Alternatively, you may enable the
innodb_large_prefix
option for your database. Refer to your database's documentation for instructions on how to properly enable this option.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With