【问题标题】:Change behavior of FROM_UNIXTIME(0)更改 FROM_UNIXTIME(0) 的行为
【发布时间】:2013-12-04 17:38:01
【问题描述】:

在我们的项目中有很多准备好的语句,它们使用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));

【问题讨论】:

    标签: mysql time prepared-statement unix-timestamp


    【解决方案1】:

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

    TIMESTAMP 的范围为 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。

    [ deletia ]

    无效的DATEDATETIMETIMESTAMP 值将转换为相应类型('0000-00-00''0000-00-00 00:00:00')的“零”值。

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

    如果您没有使用严格模式(即,STRICT_TRANS_TABLESSTRICT_ALL_TABLES 均未启用),MySQL 会为无效或缺失值插入调整值并产生警告。在严格模式下,您可以使用INSERT IGNOREUPDATE IGNORE 来产生这种行为。

    因此,你可以这样做:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多