【问题标题】:After upgrade to laravel 5.3 error invalid datetime format: 1292 Incorrect datetime value: '0000-00-00 00:00:00'升级到 laravel 5.3 后错误 datetime format: 1292 Incorrect datetime value: '0000-00-00 00:00:00'
【发布时间】:2020-04-19 21:48:32
【问题描述】:

我将我的项目从 5.2 升级到 laravel 5.3。现在当我想运行php artisan migrate 时,我收到错误:

SQLSTATE[22007]:日期时间格式无效:1292 日期时间不正确 值:第 1 行的列“created_at”的值:“0000-00-00 00:00:00”(SQL: alter table messages add deleted_at timestamp null)。

我的迁移:

  Schema::table(Models::table('messages'), function (Blueprint $table) {
        $table->softDeletes();
  });

在 Blueprint.php 中:

    public function softDeletes()
    {
        return $this->timestamp('deleted_at')->nullable();
    }

【问题讨论】:

    标签: laravel date timestamp migration


    【解决方案1】:

    Laravel 5.3 已更新为默认使用 MySQL “严格”模式,其中包括 NO_ZERO_DATE 模式。

    问题是您的现有数据被允许将“0000-00-00 00:00:00”作为日期时间值。但是,现在您的连接正在使用不允许该值 (NO_ZERO_DATE) 的 sql 模式。当您尝试更改表以添加deleted_at 列时,它会抱怨created_at 列中的现有数据违规。

    理想的解决方案是修复数据库中的所有数据。也就是说,检查您的数据库并更新您的日期时间/时间戳字段,使它们可以为空,并将它们的数据从 '0000-00-00 00:00:00' 转换为空。

    但是,快速选项是在您的数据库连接上禁用“严格”模式。打开您的config/database.php 文件,并确保您的数据库连接显示'strict' => false

    【讨论】:

    • 'strict' => false - 这对我有帮助。谢谢你。但是当我从数据库中删除所有数据时,我遇到了同样的错误。
    【解决方案2】:

    在带有时间戳(created 和 updated_at)的表中添加 datetime 列时,我遇到了同样的问题。

    我解决了在迁移中添加 '->nullable($value = true)' 修饰符:

    $table->datetime('expires_at')->nullable($value = true);

    我知道数据库抱怨如果输入不来就插入所有的零。将指令添加为可为空就可以了。

    【讨论】:

    • 它对我有用。但你能解释一下它为什么有效吗?
    【解决方案3】:

    无论如何,我喜欢将默认设置为 NOW()

    所以$table->datetime('expires_at')->default(NOW());也是一个不错的选择。

    【讨论】:

      【解决方案4】:

      此错误由 mysql 5.7 的 sqlmode 中的 STRICT_TRANS_TABLES 和 NO_ZERO_DATE 引起

      禁用它,这样所有的东西都可以正常工作。

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多