You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,
    ]);

复现步骤

  1. 首次执行迁移,创建长度为4的province_code字段
  2. 编写上述updateOrCreate代码
  3. 再次执行迁移,将province_code字段长度改为255
  4. 运行代码触发字段过长错误
解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:14:54