在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
对于这个错误,我找到了两个解决方案
选项1:
打开database/migrations文件夹下的user和password_reset表
只需要改变邮件的长度:
$table->string('email',191)->unique();
选项2:
打开app/Providers/AppServiceProvider.php文件,在boot()方法中设置一个默认字符串长度:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
没有人告诉的解决方案是,在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(如果它存在),你就可以开始了。
Laravel 5.4由数据库版本导致。
根据文档(在索引长度和MySQL / MariaDB部分):
Laravel默认使用utf8mb4字符集,其中包括
支持在数据库中存储“表情包”。如果你正在运行一个
MySQL版本高于5.7.7或MariaDB版本高于5.7.7
对于10.2.2版本,您可能需要手动配置默认值
由迁移生成的字符串长度,以便MySQL创建
它们的索引。方法进行配置
方案::defaultStringLength方法在你的AppServiceProvider。
换句话说,在<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);
}
// ...
}
但正如另一个答案的评论所说:
注意这个解决方案。例如,如果您索引电子邮件字段,
存储邮件的最大长度为191个字符。这个更少
比RFC官方声明的要多。
因此,文档还提出了另一种解决方案:
或者,您可以启用innodb_large_prefix选项
数据库。有关的说明,请参阅数据库的文档
如何正确启用此选项。