在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
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工匠迁移:重置
如果您想在AppServiceProvider中进行更改,那么您需要在迁移中定义电子邮件字段的长度。只需将第一行代码替换为第二行。
create_users_table
$table->string('email')->unique();
$table->string('email', 50)->unique();
create_password_resets_table
$table->string('email')->index();
$table->string('email', 50)->index();
在成功更改之后,您可以运行迁移。
注意:首先你必须从数据库中删除(如果你有)users表,password_resets表,并从迁移表中删除users和password_resets条目。
我只是把这个答案加在这里,因为这对我来说是最快的解决方法。只需要将默认的数据库引擎设置为'InnoDB'
/ config / database.php
'mysql' => [
...,
...,
'engine' => 'InnoDB',
]
然后运行PHP artisan config:cache来清除和刷新配置缓存
编辑:
这里找到的答案可能解释了这一事件背后的原因
我不知道为什么上面的解和官方的解是相加的
Schema::defaultStringLength(191);
在AppServiceProvider中不适合我。
工作的是编辑config文件夹中的database.php文件。
只是编辑
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
to
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
它应该可以工作,尽管你将无法存储扩展的多字节字符,如表情符号。
这是一个丑陋的黑客,如果你想存储字符串在非英语语言,表情符号
我用Laravel 5.7做的。
不要忘记停止并再次启动服务器。
我得到了这个错误尽管我已经有了(实际上因为我已经有了)
模式:defaultStringLength (191);在AppServiceProvider.php文件中。
原因是我试图在我的一个迁移中设置一个高于191的字符串值:
Schema::create('order_items', function (Blueprint $table) {
$table->primary(['order_id', 'product_id', 'attributes']);
$table->unsignedBigInteger('order_id');
$table->unsignedBigInteger('product_id');
$table->string('attributes', 1000); // This line right here
$table->timestamps();
});
删除1000或将其设置为191解决了我的问题。