在Laravel 5.4上使用php artisan make:auth迁移错误
[Illuminate\Database\QueryException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter tabl e users add unique users_email_unique(email))
[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
没有人告诉的解决方案是,在Mysql v5.5和以后的InnoDB是默认的存储引擎,它没有这个问题,但在许多情况下,像我的,有一些旧的Mysql ini配置文件使用旧的MYISAM存储引擎,如下所示。
default-storage-engine=MYISAM
这造成了所有这些问题,解决方案是将Mysql的ini配置文件中的默认存储引擎一劳永逸地更改为InnoDB,而不是做临时的hack。
default-storage-engine=InnoDB
如果你在MySql v5.5或更高版本,那么InnoDB是默认引擎,所以你不需要像上面那样显式地设置它,只要从你的ini文件中删除default-storage-engine=MYISAM(如果它存在),你就可以开始了。
对于不想更改AppServiceProvider.php的人。
(在我看来,仅仅为了迁移而更改AppServiceProvider.php是一个坏主意)
您可以将数据长度添加回database/migrations/下的迁移文件,如下所示:
create_users_table.php
$table->string('name',64);
$table->string('email',128)->unique();
create_password_resets_table.php
$table->string('email',128)->index();
Laravel 7。X(也适用于8X):简单的解决方案。
选项1:
php artisan db:wipe
更新/config/database.php中mysql数组的这些值
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
然后
php artisan migrate
这是完成了!迁移表创建成功。
选项2:
使用php artisan db:手动擦除或删除数据库中的所有表。
更新AppServiceProvider.php[位于app/Providers/AppServiceProvider.php]
use Illuminate\Support\Facades\Schema;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
然后
php artisan migrate
这是完成了!
陷阱:我想提一下@shock_gone_wild的评论
注意这个解决方案(选项2)。例如,如果您索引电子邮件字段,
存储邮件的最大长度为191个字符。这个更少
比RFC官方声明的要多。
可选地,我尝试了这些可能的方法(如下面),但不工作。
PHP artisan config:cache PHP artisan migrate:fresh
PHP工匠迁移:重置