Documentation Home

6.3.11 日期时间类型处理

  • connectionTimeZone

    如果在保留即时时间值时需要在 JVM 默认值和目标时区之间进行转换,则配置 Connector/J 使用的连接时区。

    接受地理时区名称或格林威治/UTC 的时区偏移量,使用能够解析的语法“java.time.ZoneId”,或两个逻辑值“LOCAL”和“SERVER”之一。默认为“本地”。如果设置为显式时区,则它必须是 JVM 或 JVM 和 MySQL 都支持的时区。如果设置为“本地”,则驱动程序假定连接时区与 JVM 默认时区相同。如果设置为“SERVER”,则驱动程序会尝试从 MySQL 服务器会话变量“time_zone”或“system_time_zone”上配置的值检测会话时区。

    此选项本身不会将 MySQL 服务器会话变量“time_zone”设置为给定值。为此,必须将“forceConnectionTimeZoneToSession”连接选项设置为“true”。

    请注意,将“connectionTimeZone”的值与“forceConnectionTimeZoneToSession=false”和“preserveInstants=false”一起设置无效,因为在这种情况下,此选项既不用于更改会话时区,也不用于时区转换基于时间的数据。

    以前的连接选项“serverTimezone”作为此选项的别名仍然有效,但将来可能会被弃用。

    有关详细信息,另请参阅“forceConnectionTimeZoneToSession”和“preserveInstants”。

    自版本 3.0.2
  • forceConnectionTimeZoneToSession

    如果启用,则将由“connectionTimeZone”连接属性确定的时区值设置为当前服务器会话“time_zone”变量。如果时区值作为地理时区给出,则 Connector/J 在服务器会话中按原样设置此值,在这种情况下,必须事先填充时区系统表(有关详细信息,请参阅 MySQL 服务器文档) ; 但是,如果在任何支持的语法中该值作为与格林威治/UTC 的偏移量给出,则服务器会话时区将设置为与 UTC 的数字偏移量。

    因此,当存储在 TIMESTAMP 列中时,不需要 JVM 默认时区和连接时区之间的中间转换来存储即时 Java 对象(例如“java.sql.Timestamp”或“java.time.OffsetDateTime”)的正确毫秒值。

    请注意,它还会影响 MySQL 函数的结果,例如“NOW()”、“CURTIME()”或“CURDATE()”。

    如果与“connectionTimeZone=SERVER”一起使用,则此选项无效,因为在这种情况下,会话已设置为所需的时区。

    有关详细信息,另请参阅“connectionTimeZone”和“preserveInstants”。

    默认值 错误的
    自版本 8.0.23
  • noDatetimeStringSync

    不要确保“ResultSet.getTimestamp().toString().equals(ResultSet.getString())”。

    默认值 错误的
    自版本 3.1.7
  • preserveInstants

    如果启用,Connector/J 会尽力保留 Java 基于即时对象(例如“java.sql.Timestamp”或“java.time.OffsetDateTime”)而不是其原始视觉形式的时间线上的即时点。否则,驱动程序始终使用 JVM 默认时区来呈现它发送到服务器的值以及从获取的数据构造 Java 对象。

    MySQL 对 TIMESTAMP 值使用隐式时区转换:它们从会话时区转换为 UTC 用于存储,然后从 UTC 转换回会话时区用于检索。因此,为了在内部存储正确正确的 UTC 值,驱动程序在发送到服务器之前将值从原始时区转换为会话时区。在检索时,Connector/J 将接收到的值从会话时区转换为 JVM 默认值。

    存储时,仅当目标“SQLType”(显式类型或默认类型)为 TIMESTAMP 时才执行转换。检索时,仅当源列具有 TIMESTAMP、DATETIME 或字符类型并且目标类是基于即时的类(如“java.sql.Timestamp”或“java.time.OffsetDateTime”)时才执行转换。

    请注意,如果与“connectionTimeZone=LOCAL”一起使用,此选项无效,因为在这种情况下,源时区和目标时区相同。不过,在这种情况下,如果与“forceConnectionTimeZoneToSession=true”一起设置,仍然可以存储正确的即时值。

    有关详细信息,另请参阅“connectionTimeZone”和“forceConnectionTimeZoneToSession”。

    默认值 真的
    自版本 8.0.23
  • sendFractionalSeconds

    如果设置为“false”,则在将任何数据发送到服务器之前,小数秒将始终被截断。此选项仅适用于准备好的语句、可调用语句或可更新的结果集。

    默认值 真的
    自版本 5.1.37
  • sendFractionalSecondsForTime

    如果设置为“false”,将根据 JDBC 规范的要求忽略“java.sql.Time”的小数秒。如果设置为“true”,它的值以小数秒呈现,允许将毫秒存储到 MySQL TIME 列中。此选项仅适用于准备好的语句、可调用语句或可更新的结果集。如果“sendFractionalSeconds=false”则无效。

    默认值 真的
    自版本 8.0.23
  • treatUtilDateAsTimestamp

    出于“PreparedStatement.setObject()”的目的,驱动程序是否应将“java.util.Date”视为时间戳?

    默认值 真的
    自版本 5.0.5
  • yearIsDateType

    JDBC 驱动程序应该将 MySQL 类型 YEAR 视为“java.sql.Date”还是 SHORT?

    默认值 真的
    自版本 3.1.9
  • zeroDateTimeBehavior

    当驱动程序遇到完全由零组成的 DATETIME 值时会发生什么 - MySQL 使用它来表示无效日期?有效值为“EXCEPTION”、“ROUND”和“CONVERT_TO_NULL”。

    默认值 例外
    自版本 3.1.4