在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


当前回答

我认为强制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

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

其他回答

你可以这样设置索引字段的字符串长度:

  $table->string('email', 200)->unique();

只要在/etc/mysql/mariadb.conf.d/50-server.cnf或其他配置文件中写几行:

innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
innodb_default_row_format = 'DYNAMIC'

和sudo服务mysql重启

https://stackoverflow.com/a/57465235/778234

查看文档:https://dev.mysql.com/doc/refman/5.6/en/innodb-row-format.html

如果您想在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条目。

没有人告诉的解决方案是,在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(如果它存在),你就可以开始了。

在database.php

-添加这一行:

引擎=>无害的ROW_FORMAT=动力,