gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 17:50:11 24 4
gpt4 key购买 nike

我在进行数据库迁移时遇到了一种情况,这与我认为我所了解的有关 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]:语法错误或访问冲突:1067“published_at”的默认值无效(SQL:ALTER TABLE posts MODIFY COLUMN text_html LONGTEXT COLLATE utf8_unicode_ci)

我认为这可能与 Laravel 有关,所以我尝试做一个更“原始”的查询:

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

这给了我类似的错误:

执行“ALTER TABLE posts MODIFY COLUMN text_html LONGTEXT COLLATE utf8_unicode_ci”时发生异常:SQLSTATE[42000]:语法错误或访问冲突:1067“published_at”的默认值无效

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

最佳答案

编辑:

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');
});
}

如果您的数据库已经是utf8_unicode_ci,则不需要收集

关于php - 为什么运行 Laravel/Doctrine 原始数据库查询与使用 mysql cli 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49427317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com