gpt4 book ai didi

mysql - 更改 FROM_UNIXTIME(0) 的行为

转载 作者:行者123 更新时间:2023-11-30 00:58:12 25 4
gpt4 key购买 nike

在我们的项目中,有很多准备好的语句,它们使用 FROM_UNIXTIME(?) 将一些值设置为 timestamp 列。有几个地方的逻辑取决于 FROM_UNIXTIME(0) 将写入 0000-00-00 00:00:00 的假设。这在测试机上完美运行。

在另一台机器上,mysql 配置为 sql_mode STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION。当我尝试 FROM_UNIXTIME(0) 时,它会返回

ERROR 1292 (22007): Incorrect datetime value: '1970-01-01 02:00:00' for column 'date' at row 1

不幸的是,我既不能更改准备好的语句,也不能更改 mysql 配置。有什么方法可以绕过这些检查并使该功能像在第一台机器上一样工作吗?我只看到一种方法 - 使用 IF 语句,但我确信应该有更正确的方法。

这是一个简短的 sscce:

CREATE TABLE test ( date TIMESTAMP NOT NULL DEFAULT 0 );
SET sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
INSERT INTO test VALUES (FROM_UNIXTIME(0));

最佳答案

The DATE, DATETIME, and TIMESTAMP Types 下所述:

TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.

[ deletia ]

Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').

因此,FROM_UNIXTIME(0)(即 '1970-01-01 00:00:00' UTC)在 TIMESTAMP 中无效code> 列,并将转换为 '0000-00-00 00:00:00' (如果禁用严格模式)。如 Server SQL Modes 下所述:

If you are not using strict mode (that is, neither STRICT_TRANS_TABLES nor STRICT_ALL_TABLES is enabled), MySQL inserts adjusted values for invalid or missing values and produces warnings. In strict mode, you can produce this behavior by using INSERT IGNORE or UPDATE IGNORE.

因此,您可以这样做:

INSERT IGNORE INTO test VALUES (FROM_UNIXTIME(0));

但是,请注意,这将忽略所有错误(不仅仅是无效的时间戳值)。

关于mysql - 更改 FROM_UNIXTIME(0) 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382118/

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