Laravel对接MSSQL注册用户时nvarchar转datetime类型转换错误
解决Laravel + MSSQL注册时的datetime转换错误
我之前在Laravel对接MSSQL做用户认证的时候也碰到过一模一样的问题,错误提示里的SQLSTATE[22007]本质是MSSQL的datetime类型和Laravel默认的时间戳处理不兼容导致的,下面给你几个靠谱的解决办法:
方法一:修改迁移文件(推荐,适合还没完成迁移或可以回滚的情况)
Laravel默认的timestamps()方法在MSSQL中会生成datetime类型字段,但这个类型的时间范围有限(仅支持1753-01-01到9999-12-31),而且精度上和Laravel的Carbon时间工具不太匹配。我们可以修改迁移文件,改用datetime2类型(MSSQL支持的更灵活的时间类型,范围覆盖0001-01-01到9999-12-31,精度更高):
- 找到
database/migrations目录下创建users表的迁移文件(文件名类似2014_10_12_000000_create_users_table.php) - 把原来的:
替换成:$table->timestamps();
或者更简洁的写法:$table->timestamp('created_at')->useCurrent()->type('datetime2'); $table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate()->type('datetime2');$table->timestamps()->type('datetime2'); - 如果已经执行过迁移,先回滚:
然后重新执行迁移:php artisan migrate:rollbackphp artisan migrate
方法二:直接修改已存在的表结构(适合已经完成迁移不想回滚的情况)
如果你的表已经创建好了,不想回滚迁移,可以通过Artisan Tinker或者直接执行SQL语句修改字段类型:
- 打开Artisan Tinker:
php artisan tinker - 执行以下语句修改users表的时间字段:
执行完退出Tinker即可。DB::statement("ALTER TABLE users ALTER COLUMN created_at datetime2 NULL"); DB::statement("ALTER TABLE users ALTER COLUMN updated_at datetime2 NULL");
额外检查项
- 确认你的
config/app.php里的时区设置和MSSQL数据库的时区一致,比如:
时区不匹配也可能导致时间转换时出现超出范围的问题。'timezone' => 'Asia/Shanghai', - 确保你的User模型里开启了自动时间戳(默认是开启的):
class User extends Authenticatable { public $timestamps = true; // ...其他代码 }
这样修改后,再去注册新用户应该就不会出现那个转换错误了。
内容的提问来源于stack exchange,提问作者Greg Ostry
相关产品推荐
相关产品推荐

