返回

MySQL UTC格式在SELECT与UPDATE中为何表现不同?

mysql

MySQL UTC 格式在“SELECT”与“UPDATE”中的差异

背景

MySQL中的UTC时间戳确保了数据时间的一致性,但我们在使用中遇到了一个怪现象:UTC格式在“SELECT”查询中可用,而在“UPDATE”语句中却失效。

问题

我们使用DATETIME数据类型的“created_at”字段存储时间戳,如下查询可以正确返回UTC格式时间:

SELECT created_at FROM table_name WHERE created_at > '2023-03-08 12:00:00';

然而,当使用“UPDATE”更新“created_at”字段时,却报“Incorrect datetime value”错误:

UPDATE table_name SET created_at = '2023-03-08 12:00:00' WHERE id = 1;

解决方法

为解决此问题,时间戳必须转换为MySQL接受的‘YYYY-MM-DD HH:MM:SS’格式:

UPDATE table_name SET created_at = '2023-03-08 12:00:00' WHERE id = 1;

困惑之处

虽然解决了问题,但我们不解的是,既然“SELECT”能识别UTC格式,为什么“UPDATE”却不行。UTC更准确,因此我们认为两种语句都应支持UTC。

可能的解释

一种解释是MySQL对“SELECT”和“UPDATE”语句使用不同的解析机制。对于“SELECT”,解析器更宽松,允许UTC格式;而对于“UPDATE”,解析器更严格,只接受‘YYYY-MM-DD HH:MM:SS’格式。

另一种解释是,MySQL内部将UTC格式存储为时区无关的二进制值。检索数据时,MySQL会将其转换为当前时区。但更新数据时,MySQL可能要求提供时区特定值,如‘YYYY-MM-DD HH:MM:SS’。

结论

虽然我们无法确定确切原因,但我们了解到MySQL处理UTC格式时存在这种差异。为避免错误,在使用“UPDATE”更新datetime字段时,必须使用‘YYYY-MM-DD HH:MM:SS’格式。

常见问题解答

  1. 为什么“SELECT”可以识别UTC格式?
    MySQL的“SELECT”解析器可能更宽松,允许UTC格式。

  2. 为什么“UPDATE”不能识别UTC格式?
    “UPDATE”解析器可能更严格,只接受‘YYYY-MM-DD HH:MM:SS’格式。

  3. 如何解决“Incorrect datetime value”错误?
    将时间戳转换为‘YYYY-MM-DD HH:MM:SS’格式。

  4. MySQL内部如何存储UTC格式?
    时区无关的二进制值。

  5. “SELECT”和“UPDATE”的处理差异是如何产生的?
    可能是由于不同的解析机制或MySQL内部存储UTC格式的方式。