为什么 运行 Laravel / Doctrine 原始数据库查询与使用 mysql cli 不一样?

Why running Laravel / Doctrine raw database queries is not the same as using mysql cli?

我在进行数据库迁移时遇到了一种情况,这与我对 php 数据库连接的了解相矛盾。我想改变一个列的排序规则,所以我写了下面的语句:

ALTER TABLE posts MODIFY COLUMN text_html LONGTEXT COLLATE utf8_unicode_ci

使用 mysql cli 可以正常工作。现在,为了在代码中跟踪此更改,我使用以下语句创建了一个 Laravel 迁移:

DB::unprepared('ALTER TABLE posts MODIFY COLUMN text_html LONGTEXT COLLATE utf8_unicode_ci');

我收到以下错误:

SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'published_at' (SQL: ALTER TABLE posts MODIFY COLUMN text_html LONGTEXT COLLATE utf8_unicode_ci)

我认为这可能与 Laravel 有关,所以我尝试进行更多 "raw" 查询:

DB::connection() ->getDoctrineConnection() ->exec('ALTER TABLE posts MODIFY COLUMN text_html LONGTEXT COLLATE utf8_unicode_ci');

这给了我一个类似的错误:

An exception occurred while executing 'ALTER TABLE posts MODIFY COLUMN text_html LONGTEXT COLLATE utf8_unicode_ci': SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'published_at'

所以这里其实有两个问题。第一个,显然,如果我试图修改 text_html 列,为什么我会收到有关 published_at 列的错误。但是第二个,我更感兴趣的一个,是为什么它在 mysql cli 上工作而不在 php 上工作的原因。如果 php 中的 运行 原始查询与使用 mysql cli 的 运行 查询不同,这告诉我 php 正在做的不仅仅是 [=52] =] 查询。它在做什么?

编辑:

Laravel 有一个自定义配置,默认情况下不包含在 mysql cli 中。可以在 config/database.php

中找到

我个人这样做是为了绕过那个。这对我有用,因为 我想保持严格模式 。如果您不在乎,请使用第一段解决方案。

public function up()
    {

        Schema::table('posts', function ($table) { // you can drop the $table param. Also Schema::table might be redundant so try without first
            DB::statement('ALTER TABLE posts MODIFY text_html LONGTEXT COLLATE utf8_unicode_ci');
        });
    }

如果您的 Db 已经是 utf8_unicode_ci

,则不需要收集