原始SQL查询在MySQL Workbench中运行良好,但通过Laravel执行时会导致SQLSTATE[22007]

dxpyg8gm  于 2022-12-05  发布在  Mysql
关注(0)|答案(1)|浏览(139)

我尝试在Laravel中使用DB::select(DB::raw(..))执行RAW查询,但它返回
SQLSTATE[22007年]:无效的日期时间格式:1292截断的时间值不正确
仅供参考,列在MySQL数据库中为TIMESTAMP数据类型。在MySQL Workbench中执行相同的查询可以正常工作。
我假设Laravel-MySQL通信的一些默认设置可能是罪魁祸首,但我可能错了。
提前感谢!
我试着在谷歌上搜索这个问题,但没有找到更多的信息,除了将config/database.php〉〉mysql〉〉strict模式改为False,因为默认值是True。除非绝对必要,否则我不想更改配置文件。这让我想到,MySQL Strict模式到底指的是什么?

bf1o4zei

bf1o4zei1#

错误消息SQLSTATE[22007]:无效的日期时间格式:1292 1292截断的不正确时间值表示您试图在TIMESTAMP列中插入或更新的值的格式无效。如果您试图插入或更新的值不是有效的日期或时间字符串,或者该值与TIMESTAMP列所需的格式不匹配,则会发生这种情况。
在MySQL中,严格模式是指服务器在检查数据有效性时应用的一组规则。启用严格模式时,服务器将拒绝TIMESTAMP列的无效值并返回错误,如您所看到的错误。禁用严格模式时,服务器将自动将无效值转换为列的默认值(通常为0000-00 -00 00:00:00),并且不会返回错误。
若要修正您看到的错误,您必须确定您尝试在TIMESTAMP数据行中插入或更新的值是有效的日期或时间字串,而且符合数据行的预期格式。您可以检查您正在使用的值,并确定其格式有效,例如YYYY-MM-DD HH:MM:SS。
或者,您也可以在config/database.php文件中设置mysql.strict选项为false来禁用strict模式。这将允许服务器自动将无效值转换为列的默认值,从而防止错误发生。但是,通常建议您保持启用strict模式,因为它有助于确保数据的完整性和一致性。
下面是一个如何在config/database.php文件中禁用严格模式的示例:

'connections' => [
    // Other connection settings...

    'mysql' => [
        // Other MySQL settings...

        'strict' => false,
    ],
],

您可以视需要修改此程式码,以符合您的特定需求。例如,您可以只针对特定联机将strict选项设定为false,或者您可以根据您的需求,为选项指定不同的值。

相关问题