Laravel 9存储手机号报错:SQLSTATE[22003]数值越界如何解决?
问题原因与解决方案
问题根源
- 字段类型范围不足:MySQL中
integer类型的最大值为2147483647(仅10位数字),你生成的手机号是091(3位)加10位随机字符,总长度13位,远超出integer的存储范围,直接触发数值溢出报错。 - 手机号不适合用数值类型存储:手机号本质是字符串标识,并非用于计算的数值,用
integer存储会丢失前导零,同时无法兼容带国际区号的手机号格式。
解决步骤
- 修改数据库字段类型为字符串
- 若未执行迁移,直接修改原迁移文件:
$table->string('usr_mobile_phone', 15); // 15位长度足够覆盖绝大多数手机号格式 - 若已执行迁移,创建新迁移修改字段:
执行命令生成迁移文件:
编辑新迁移文件:php artisan make:migration modify_usr_mobile_phone_in_users_table
运行迁移使修改生效:use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up() { Schema::table('users', function (Blueprint $table) { $table->string('usr_mobile_phone', 15)->change(); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->integer('usr_mobile_phone')->change(); }); } };php artisan migrate
- 若未执行迁移,直接修改原迁移文件:
- 填充器代码无需修改
字段改为字符串类型后,原填充器生成的带前导零的手机号字符串可直接存储,不会丢失格式或出现溢出问题。
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

