TIME 函数在 5.5 和 5.6 之间变化

Mau*_*cho 5 mysql mysql-5.5 functions mysql-5.6

我面临一个问题,当从 MySQL 5.5.46 迁移到 MySQL 5.6.34 时,我无法使用 TIME 函数获得相同的结果。问题是,当我在 5.5 中使用 TIME 函数时,它在 datetime 为“0000-00-00 00:00:00”时返回 NULL,但前提是它是来自表的值,但使用 5.6 我得到'00:00:00'。这听起来不错,但是有许多查询依赖于 5.5 的行为(结果为 NULL)。这是我为准确测试该行为所做的示例:

一、表:

CREATE TABLE `prueba_time` (
  `check_in` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

然后我插入一行值为 0000-00-00 00:00:00

mysql> INSERT INTO prueba_time VALUES ('0000-00-00 00:00:00');
Run Code Online (Sandbox Code Playgroud)

然后我测试了TIME函数……5.5中的结果是:

mysql> SELECT TIME(check_in),check_in,TIME('0000-00-00 00:00:00') FROM prueba_time;
+----------------+---------------------+-----------------------------+
| TIME(check_in) | check_in            | TIME('0000-00-00 00:00:00') |
+----------------+---------------------+-----------------------------+
| NULL           | 0000-00-00 00:00:00 | 00:00:00                    |
+----------------+---------------------+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

和 5.6 中的相同查询:

mysql> SELECT TIME(check_in),check_in,TIME('0000-00-00 00:00:00') FROM prueba_time;
+----------------+---------------------+-----------------------------+
| TIME(check_in) | check_in            | TIME('0000-00-00 00:00:00') |
+----------------+---------------------+-----------------------------+
| 00:00:00       | 0000-00-00 00:00:00 | 00:00:00                    |
+----------------+---------------------+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

所以......不同的结果,我不知道为什么......

sql_mode 就不一样了。在 5.5 中它是空的,在 5.6 中我使用的是 STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION 但根据我所读到的内容,这没有影响。我希望你能帮我解决这个问题。

And*_*y M 1

我在这里看不出有什么问题。如果有的话,我会说问题出在旧的行为上,因为它只是不一致。根据是'0000-00-00 00:00:00'作为文字还是作为列值传递,TIME 将返回 a00:00:00或 null。然而,从版本 5.6 开始,它始终返回00:00:00.

因此,要回答行为改变的原因,之前的行为是有问题的,而新的行为(更)一致。