在我们的项目中,有很多准备好的语句,它们使用 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
, orTIMESTAMP
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
norSTRICT_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 usingINSERT IGNORE
orUPDATE IGNORE
.
因此,您可以这样做:
INSERT IGNORE INTO test VALUES (FROM_UNIXTIME(0));
但是,请注意,这将忽略所有错误(不仅仅是无效的时间戳值)。
关于mysql - 更改 FROM_UNIXTIME(0) 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382118/