在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


当前回答

模式:defaultStringLength (191);将默认定义所有字符串191的长度,这可能会破坏您的数据库。你不能走这条路。

只需在数据库迁移类中定义任何特定列的长度。例如,我在CreateUsersTable类中定义了“name”,“username”和“email”,如下所示:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 191);
            $table->string('username', 30)->unique();
            $table->string('email', 191)->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

其他回答

我认为强制stringlength到191是一个非常糟糕的主意。 所以我去调查了解到底发生了什么。

我注意到这个消息错误:

SQLSTATE[42000]:语法错误或访问违规:1071指定的键 太长了;最大密钥长度为767字节

在我更新MySQL版本后开始出现。所以我已经用PHPMyAdmin检查了表,我注意到所有创建的新表都带有utf8mb4_unicode_ci,而不是旧表的utf8_unicode_ci。

在我的doctrine配置文件中,我注意到charset被设置为utf8mb4,但我之前的所有表都是在utf8中创建的,所以我猜这是一些更新魔术,它开始在utf8mb4上工作。

现在最简单的解决方法是更改ORM配置文件中的行字符集。 然后使用utf8mb4_unicode_ci删除表(如果您在dev模式下),或者如果您不能删除它们则修复字符集。

Symfony 4

在config/packages/doctrine.yaml中将字符集:utf8mb4修改为字符集:utf8

现在我的理论迁移又开始起作用了。

与其设置长度限制,我建议以下方法,这对我来说很有效。

内部:

配置/ database.php

将这一行替换为mysql:

'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',

:

'engine' => null,

对于可能遇到这种情况的任何人,我的问题是我正在创建一个类型为字符串的列,并试图使它->unsigned()当我想让它是一个整数时。

这很常见,因为Laravel 5.4将默认数据库字符集更改为utf8mb4。你要做的是:编辑你的App\Providers.php,把这段代码放在类声明之前

use Illuminate\Support\Facades\Schema;

另外,将此添加到'boot'功能 模式:defaultStringLength (191);

为了避免更改代码中的任何内容,只需将MySQL服务器更新到至少5.7.7

更多信息请参考:https://laravel-news.com/laravel-5-4-key-too-long-error