问答中心分类: MYSQLLaravel迁移错误:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节
0
匿名用户 提问 7小时 前

Laravel 5.4上的迁移错误php artisan make:auth

[Illumb\Database\QueryException]SQLSTATE[42000]:语法错误或访问冲突:1071指定的键太长;最大密钥长度为767字节(SQL:alter tabl eusers添加唯一项users_email_unique(email))
【PDOException】SQLSTATE【42000】:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节

29 Answers
0
Koushik Das 回答 7小时 前

我不知道为什么上面的解决方案和正在添加的官方解决方案

Schema::defaultStringLength(191);

在里面AppServiceProvider不适合我。database.php文件位于config文件夹

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

它应该会起作用,虽然您无法存储像表情符号这样的扩展多字节字符.
这是一个丑陋的黑客,如果你想用非英语的表情符号来存储字符串,就不要这么做
我用Laravel 5.7做到了。希望有帮助。
不要忘记停止并再次启动服务器。

Jeff Puckett 回复 7小时 前

使用此字符集只允许保存标准ASCII,而不允许保存来自阿拉伯语、希伯来语、大多数欧洲脚本的多字节特殊字符,当然还有表情符号。另请参见堆栈溢出。电话:15128103/4233593

pimpace 回复 7小时 前

我想你错过了这部分use Illuminate\Support\Facades\Schema;在顶部。

pimpace 回复 7小时 前

@KoushikDas您使用的是什么版本的Laravel?

Koushik Das 回复 7小时 前

现在我使用的是6.0。我想我最初是用5.7或者5.6来完成的。

Flame 回复 7小时 前

这个utf8mb4排序规则的存在是有原因的,如果可以,我建议您使用它。

Jay Bienvenu 回复 7小时 前

这些都是默认值,对吗?它们可以被列覆盖,对吗?

Andrew Koster 回复 7小时 前

这是一个丑陋的黑客行为,但在你的回答中,你正在解释为什么它不好。

Daddi Al Amoudi 回复 7小时 前

这个评论对我也有帮助。这个AppServiceProvider也不适合我。

0
Dexter Bengil 回答 7小时 前

我只是在这里添加这个答案,因为它是quickest我的解决方案。只需将默认数据库引擎设置为'InnoDB'在…上
/config/database.php

'mysql' => [
    ...,
    ...,
    'engine' => 'InnoDB',
 ]

然后运行php artisan config:cache清除和刷新配置缓存
编辑:在这里也许可以解释这件事背后的原因

Kevin Farel 回复 7小时 前

完美的解决方案。最好有一些文档,以便将来解释

Bill M. 回复 7小时 前

一个快速更新:我写了“InnoDB ROW\u FORMAT=DYNAMIC”,而不是下面其他评论中提到的“InnoDB”,并且它起到了作用。然而,我不知道这意味着什么以及它如何影响Laravel应用程序。如果有人知道的话,我会非常感谢你的提醒。

Khean 回复 7小时 前

太好了,谢谢。同时与Laravel 9合作

M.Arjmandi 回复 7小时 前

这对我没用!

0
perfectionist1 回答 7小时 前

拉雷维尔7。X(也适用于8X):易于理解的解决方案.
选项1:

php artisan db:wipe

更新以下值mysql阵列在里面/配置/数据库。php

'charset' => 'utf8',
'collation' => 'utf8_general_ci',

然后

php artisan migrate

完成了!将创建迁移表成功地.

选项2:
使用 php artisan db:wipe 手动删除/删除数据库中的所有表。
使现代化你的AppServiceProvider。php [位于应用程序/提供商/AppServiceProvider。php]

use Illuminate\Support\Facades\Schema;
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191); 
}

然后

php artisan migrate

完成了!
陷阱:我想提及@shock\u gone\u wild的评论

请注意此解决方案(选项2)。例如,如果为电子邮件字段编制索引,

可选我尝试了这些可能的方法(如下所示)但不起作用.
php artisan config:cache php artisan migrate:fresh
php artisan migrate:reset

0
Esteban Herrera 回答 7小时 前

此问题在Laravel 5.4中是由数据库版本引起的。
根据文档(在Index Lengths & MySQL / MariaDB第节):

Laravel使用utf8mb4默认情况下的字符集,其中包括Schema::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);
}

// ...

}

但正如对另一个答案的评论所说:

对此解决方案要小心。例如,如果为电子邮件字段编制索引,

因此,文档还提出了另一种解决方案:

或者,您可以启用innodb_large_prefix您的

0
helloroy 回答 7小时 前

对于那些不想改变的人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();
Rob W 回复 7小时 前

这可能是一个问题,因为电子邮件最多可以包含255个字符

helloroy 回复 7小时 前

你是对的,有点疯狂,但我建议你这样回答堆栈溢出。com/questions/1297272