处理 JDBC 中的日期时间值 0000-00-00 00:00:00

2022-08-31 11:39:50

如果我尝试这样做,我得到一个例外(见下文)

resultset.getString("add_date");

对于与包含 DATETIME 值 0000-00-00 00:00:00(DATETIME 的准空值)的 MySQL 数据库的 JDBC 连接,即使我只是尝试将值作为字符串获取,而不是作为对象获取。

我通过做来解决这个问题

SELECT CAST(add_date AS CHAR) as add_date

这有效,但看起来很愚蠢...有没有更好的方法来做到这一点?

我的观点是,我只想要原始的DATETIME字符串,所以我可以按原样自己解析它。

注意:这是0000进来的地方:(来自 http://dev.mysql.com/doc/refman/5.0/en/datetime.html)

非法的 DATETIME、DATE 或 TIMESTAMP 值将转换为相应类型的“零”值('0000-00-00 00:00:00' 或 '0000-00-00')。

具体的例外是这个:

SQLException: Cannot convert value '0000-00-00 00:00:00' from column 5 to TIMESTAMP.
SQLState: S1009
VendorError: 0
java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 5 to TIMESTAMP.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.ResultSetImpl.getTimestampFromString(ResultSetImpl.java:6343)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5670)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5491)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5531)

答案 1

替代答案,您可以直接在数据源配置中使用此 JDBC URL:

jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull

编辑:

来源: MySQL 手册

具有全零分量的日期时间 (0000-00-00 ...) — 这些值在 Java 中无法可靠地表示。Connector/J 3.0.x 在从 ResultSet 读取时始终将它们转换为 NULL。

Connector/J 3.1 在遇到这些值时会默认引发异常,因为根据 JDBC 和 SQL 标准,这是最正确的行为。可以使用零日期时间行为配置属性修改此行为。允许的值为:

  • 异常(默认值),它引发 SQLState 为 S1009 的 SQLException。
  • convertToNull,返回 NULL 而不是日期。
  • round,将日期舍入到最接近的值 0001-01-01。

更新:Alexander 报告了一个影响该功能的 mysql-connector-5.1.15 的错误。请参阅官方网站上的更新日志


答案 2

我偶然发现了这个试图解决同样的问题。我正在使用的安装使用JBOSS和Hibernate,所以我不得不以不同的方式做到这一点。对于基本情况,您应该能够根据此配置属性页添加到连接 URI。zeroDateTimeBehavior=convertToNull

我发现了其他建议,指的是将该参数放在您的休眠配置中:

休眠状态下.cfg.xml

<property name="hibernate.connection.zeroDateTimeBehavior">convertToNull</property>

hibernate.properties 中

hibernate.connection.zeroDateTimeBehavior=convertToNull

但是我不得不把它放在我的mysql-ds.xml文件中,作为:

<connection-property name="zeroDateTimeBehavior">convertToNull</connection-property>

希望这有助于某人。:)