📌  相关文章
📜  第 76 行的 ERROR 1071 (42000):指定的密钥太长;最大密钥长度为 767 字节 laravel - PHP (1)

📅  最后修改于: 2023-12-03 14:56:39.842000             🧑  作者: Mango

Laravel 中的 ERROR 1071 (42000):指定的密钥太长

在 Laravel 中,当使用 MySQL 数据库时,有时候会出现 ERROR 1071 (42000) 的报错提示,报错原因为指定的密钥长度超过了 MySQL 数据库所支持的最大长度(767 字节),导致创建表失败。

报错信息

以下是报错信息的示例:

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `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. 修改数据库字符集

在 MySQL 数据库中,字符集是使用一组规则来存储和比较字符的方式,因此修改数据库的字符集是解决此问题的首选方法。

在 Laravel 中,可以通过修改 config/database.php 文件中的 charsetcollation 配置项来设置 MySQL 数据库的字符集:

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

注意:utf8mb4 是支持包含 Emoji 表情的字符集,比 utf8 更为常用。

2. 指定字段长度

当修改数据库字符集无效时,可以将对应字段的长度限制缩小到 MySQL 数据库所支持的长度以内。

在 Laravel 中,可以使用 string 类型创建指定长度的字符串字段:

Schema::create('users', function (Blueprint $table) {
    $table->string('email', 191)->unique();
});

其中的 191 是目前被认为是最大安全长度,因此可被用于索引的最大长度就限制在了 767bytes 以内。

总结

以上就是解决 Laravel 中 ERROR 1071 (42000) 的报错提示的两种方法,分别是修改数据库字符集和指定字段长度,选择一个适合你的场景即可。