![Laravel 数据库迁移报错 SQLSTATE[22001] 的解决方案](https://img.php.cn/upload/article/001/246/273/177181033510092.jpg)
本文详解 Laravel 执行 php artisan migrate 时因 MySQL 严格模式与默认字符串长度限制导致的「String data, right truncated」错误(错误码 1406),并提供安全、标准的修复方法。
本文详解 laravel 执行 `php artisan migrate` 时因 mysql 严格模式与默认字符串长度限制导致的「string data, right truncated」错误(错误码 1406),并提供安全、标准的修复方法。
在 Laravel 应用中执行数据库迁移时,若遇到如下错误:
SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'migration' at row 1
其根本原因并非用户自定义表结构(如 users 表)的问题,而是 Laravel 内部维护的 migrations 系统表字段长度不足所致。该表由框架自动创建,其中 migration 字段默认使用 VARCHAR(255),但在某些 MySQL 配置(尤其是启用 innodb_large_prefix = OFF 且行格式为 COMPACT)下,InnoDB 实际允许的索引列最大长度受限于 767 字节。当数据库字符集为 utf8mb4(Laravel 5.4+ 默认),每个字符最多占 4 字节,因此 VARCHAR(255) 理论需 1020 字节 —— 超出限制,导致插入迁移记录失败。
⚠️ 注意:直接将 string() 改为 text() 并不能解决此问题,因为 migrations 表不由你的迁移文件控制,它在首次运行 migrate 时由 Laravel 自动创建,且其结构不可通过常规迁移修改。
✅ 正确且推荐的解决方案是统一降低 Laravel 默认字符串长度,使其适配 utf8mb4 下的索引限制:
步骤一:配置默认字符串长度
在 app/Providers/AppServiceProvider.php 的 boot() 方法中添加以下代码:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}✅ 原理说明:191 × 4 = 764 字节,严格小于 767 字节上限,确保所有 string() 字段(包括 migrations.migration)均可安全创建索引。
步骤二:重置并重新运行迁移
执行以下命令清除异常状态并重试:
php artisan migrate:reset --force php artisan migrate:fresh
? 提示:若 migrations 表已损坏或残留,可先手动删除该表(开发环境适用):
DROP TABLE IF EXISTS migrations;
补充说明与最佳实践
- 此配置应在项目初始化阶段即设置,避免后续迁移反复出错;
- Laravel 5.4+ 默认启用 utf8mb4,因此 defaultStringLength(191) 已成为行业通用实践;
- 不建议修改 MySQL 配置(如开启 innodb_large_prefix)作为主要方案,因其依赖服务器权限且不具移植性;
- 若使用 Laravel 9+,该配置已内置支持,但仍建议显式声明以增强可读性与兼容性。
完成上述配置后,再次运行 php artisan migrate 即可成功创建 users 表及所有其他迁移,且 migrations 表能正确记录长命名迁移文件(如 2014_10_12_000000_create_users_table)。










