在我们的项目中,有很多准备好的语句使用timestamp
为FROM_UNIXTIME(?)
列设置了一些值。有几个地方逻辑依赖于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));
答案 0 :(得分:0)
正如The DATE
, DATETIME
, and TIMESTAMP
Types所述:
TIMESTAMP
的UTC范围为'1970-01-01 00:00:01'
UTC到'2038-01-19 03:14:07'
。[ deletia ]无效的
DATE
,DATETIME
或TIMESTAMP
值会转换为相应类型('0000-00-00'
或'0000-00-00 00:00:00'
)的“零”值。< / p>
因此,FROM_UNIXTIME(0)
,'1970-01-01 00:00:00'
UTC,在TIMESTAMP
列中无效,并将转换为'0000-00-00 00:00:00'
(如果禁用严格模式)。正如Server SQL Modes所述:
如果您没有使用严格模式(即,
STRICT_TRANS_TABLES
和STRICT_ALL_TABLES
都未启用),MySQL会为无效值或缺失值插入调整后的值并生成警告。在严格模式下,您可以使用INSERT IGNORE
或UPDATE IGNORE
生成此行为。
因此,您可以这样做:
INSERT IGNORE INTO test VALUES (FROM_UNIXTIME(0));
但请注意,这将忽略所有错误(而不仅仅是无效的时间戳值)。