这个错误是最常见的laravel错误了,使用mysql的时候,必出现,这么多年还没有修复。
laravel 12 修复:在 app/Providers/AppServiceProvider.php 中引入 Schema 并设置默认字符串长度为 191,
public function boot(): void
{
Schema::defaultStringLength(191);
}
D:\phpstudy_pro\class>php artisan migrate
INFO Preparing database.
Creating migration table ............................................................................................................ 17.71ms DONE
INFO Running migrations.
0001_01_01_000000_create_users_table ................................................................................................. 5.98ms FAIL
Illuminate\Database\QueryException
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (Connection: mysql, SQL: alter table `users` add unique `users_email_unique`(`email`))
at vendor\laravel\framework\src\Illuminate\Database\Connection.php:824
820▕ $this->getName(), $query, $this->prepareBindings($bindings), $e
821▕ );
822▕ }
823▕
➜ 824▕ throw new QueryException(
825▕ $this->getName(), $query, $this->prepareBindings($bindings), $e
826▕ );
827▕ }
828▕ }1 vendor\laravel\framework\src\Illuminate\Database\Connection.php:570
PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes")2 vendor\laravel\framework\src\Illuminate\Database\Connection.php:570
PDOStatement::execute()
原理:
- MySQL 使用 utf8mb4 ,默认 string(255) 上建唯一索引会超过 InnoDB 旧版本的 1000 字节限制,触发错误 Specified key was too long; max key length is 1000 bytes 。
- 报错发生在为 users.email 创建唯一索引时。
实施修复:- 在 app/Providers/AppServiceProvider.php 中引入 Schema 并设置默认字符串长度为 191,使索引长度落在安全范围:
- 修改的文件: d:\phpstudy_pro\class\app\Providers\AppServiceProvider.php
- 关键代码:
- use Illuminate\Support\Facades\Schema;
- 在 boot() 中添加: Schema::defaultStringLength(191);
- 由于 users 表已存在导致再次迁移失败,已执行 php artisan migrate:fresh 清理并重建所有表,迁移后成功。
验证结果- 迁移输出显示:
- create_users_table 、 create_cache_table 、 create_jobs_table 均 DONE
- 你的项目现在可以正常在当前 MySQL 设置下创建唯一索引。
推荐做法与备选方案- 如果将来升级到较新 MySQL/ MariaDB(启用 innodb_large_prefix / DYNAMIC 行格式),也可以保留 string(255) 无需此限制。
- 备选修复(不改全局默认长度):
- 在具体迁移中把需要建索引的字段改为 string('email', 191)->unique() 。
- 或在 config/database.php 将 MySQL 连接的 charset / collation 改为 utf8 / utf8_unicode_ci (不推荐,可能影响表情符号等字符)。
1633

被折叠的 条评论
为什么被折叠?



