Laravel中已扩容数据库字段仍报长度超出限制问题求助
环境信息
- Laravel版本:10.15.0
- PHP版本:8.1
- 数据库驱动及版本:MySQL Ver 8.0.33 for Linux on x86_64
问题描述
customers表中province_code字段初始为varchar(4),存入'PT-11'时触发字段过长错误。执行迁移将字段长度改为255后,数据库中字段已显示为varchar(255),且原生SQL可正常插入'PT-11',但Laravel代码执行updateOrCreate时仍抛出相同错误。
相关代码
迁移文件
public function up(): void { Schema::table('customers', function (Blueprint $table) { $table->string('country_code',255)->nullable()->comment('国家缩写')->change(); $table->string('province_code',255)->nullable()->comment('省/州缩写')->change(); }); }
报错信息
{ "getMessage": "SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'province_code' at row 1 (Connection: mysql, SQL: insert into `customers` (`email`, `root_id`, `team_id`, `name`, `phone`, `country`, `province`, `city`, `province_code`, `address`, `other_address`, `zip_code`, `user_id`, `email_account_id`, `updated_at`, `created_at`) values (76576575@163.com, 0, 0, kdoask 320, +3511932000011, Portugal, Lisboa, djkasld dalsjd dkaskda oewqpoe, PT-11, FDSFSD FDSFDS dsdsfds, lfpslfps dasdad dasdaseq, 220011, ?, 1, 2023-10-30 15:25:39, 2023-10-30 15:25:39))", "method": "App\Jobs\SaveCustomer::handle", "line": 795 }
Customer模型可填充属性(部分)
protected $fillable = [ 'name', 'email', 'address', 'city', 'country', 'country_code', 'province', 'province_code', ];
触发错误的代码
Customer::updateOrCreate( [ 'email' => $shipping['email'], 'root_id' => $this->ticket->root_id, 'team_id' => $this->ticket->team_id, ], $shipping + [ 'root_id' => $this->ticket->root_id, 'team_id' => $this->ticket->team_id, 'user_id' => $this->ticket->user_id, 'email_account_id' => $this->ticket->email_account_id, ]);
复现步骤
- 首次执行迁移,创建长度为4的
province_code字段 - 编写上述
updateOrCreate代码 - 再次执行迁移,将
province_code字段长度改为255 - 运行代码触发字段过长错误
解决方案
1. 清除Laravel缓存
Laravel可能缓存了旧的表结构信息,执行以下命令清除各类缓存:
php artisan config:clear php artisan cache:clear php artisan optimize:clear
2. 检查模型类型转换配置
确认Customer模型中没有对province_code设置错误的长度限制转换:
// 排查是否存在类似错误配置 protected $casts = [ 'province_code' => 'string:4', // 该配置会强制截断字符串至4位 ];
3. 验证数据库连接一致性
确认Laravel配置的数据库连接与你手动测试原生SQL的数据库是同一个,避免环境混淆(如测试库/生产库误用)。
4. 排查实际传入的字段值
开启SQL日志,查看province_code的实际传入值是否包含不可见字符或超出预期长度:
// 在代码执行前添加日志监听 \DB::listen(function ($query) { \Log::info($query->sql, $query->bindings); }); // 执行updateOrCreate代码
查看日志中province_code对应的绑定值,确认是否为'PT-11',而非带有空格、换行等隐藏字符的更长字符串。
5. 重新执行迁移
若以上步骤无效,尝试回滚并重新执行迁移:
php artisan migrate:rollback --step=1 php artisan migrate
执行后再次在数据库中确认province_code字段长度为255。
6. 检查数据库严格模式
临时关闭MySQL严格模式测试是否解决问题:
在.env文件中修改配置:
DB_STRICT=false
清除配置缓存后重启服务,若问题解决,再根据业务需求调整严格模式或代码逻辑。
内容的提问来源于stack exchange,提问作者666
相关产品推荐
相关产品推荐

