'0000-00-00 00:00:00'不能表示为java.sql.Timestamp错误
我有一个包含date的数据库表
(`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00').
我正在使用MySQL。 从程序中有时数据没有date传递到数据库。 所以,当date值被自动赋值为0000-00-00 00:00:00
时,表格数据被调用时会给出错误的date列
...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp.......
我试图将空值传递给插入数据的date,但是它被赋值到当前时间。
有什么办法可以在不改变表结构的情况下得到ResultSet
提前致谢
您可以直接在数据源configuration中使用此JDBC URL:
JDBC:MySQL的:// yourserver:3306 / yourdatabase zeroDateTimeBehavior = convertToNull
“date”“0000-00-00”是否是一个有效的“date”与问题无关,“只要更改数据库”很less是一个可行的解决scheme。
事实:
- MySQL允许一个值为零的date。
- 这个“function”与其他语言广泛使用。
所以,如果我“只是改变数据库”,数以千计的PHP代码行将打破。
Java程序员需要接受MySQL零date,当其他语言依赖于这个“特性”时,他们需要将零date放回到数据库中。
连接到MySQL的程序员需要处理null和0000-00-00以及有效的date。 将0000-00-00更改为空不是一个可行的选项,因为那么您不能再确定date是否预期为写回到数据库的0000-00-00。
对于0000-00-00,我build议将date值检查为一个string,然后将其更改为(“y”,1)或(“yyyy-MM-dd”,0001-01-01),或者将其更改为任何无效MySQLdate(不到1000年,iirc)。 MySQL有另一个“function”:低date自动转换为0000-00-00。
我意识到我的build议是一个kludge。 但MySQL的date处理也是如此。 而且有两件事情是不对的。 事实是,许多程序员将不得不永远处理MySQL零date。
而不是使用假date,如0000-00-00 00:00:00
或0001-01-01 00:00:00
(后者应被接受,因为它是一个有效的date),更改您的数据库架构,以允许NULL
值。
ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
将以下语句附加到JDBC-mysql协议:
?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
例如:
jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
作为一名学员,如果不能更改date列或更新值,或者在进行这些修改时,可以使用case / when进行select。
SELECT CASE ModificationDate WHEN '0000-00-00 00:00:00' THEN '1970-01-01 01:00:00' ELSE ModificationDate END AS ModificationDate FROM Project WHERE projectId=1;
我在这个问题上摔了一跤,实现了上面接受的答案@ Kushan贡献的URL连接解决方案。 它在我的本地MySql实例中工作。 但是,当我将我的Play / Scala应用程序部署到Heroku时,不再有效。 Heroku还将几个参数连接到它们提供给用户的数据库URL,而这个解决scheme由于Heroku使用“?”连接, 在他们自己的一套参数之前,将不会工作。 不过,我发现了一个不同的解决scheme似乎同样工作。
SET sql_mode = 'NO_ZERO_DATE';
我把这个在我的表格描述,它解决了'0000-00-00 00:00:00'的问题不能被表示为java.sql.Timestamp
没有一年0000,也没有00或00的第00天。我build议你试试
0001-01-01 00:00:00
虽然在某些标准中已经定义了0年,但它比有用的恕我直言更容易混淆。
只是把这个字段作为字符
例如:铸(更新)为更新字符
我知道这将是一个迟到的答案,但是这是最正确的答案。
在MySQL数据库中,将您的timestamp
默认值更改为CURRENT_TIMESTAMP
。 如果您有假logging的旧logging,您将不得不手动修复它们。
如果没有必要,你可以从你的mysql表中删除“not null”属性。 当你删除“非空”属性不需要“0000-00-00 00:00:00”转换和问题消失。
至less为我工作。
我相信这是完全帮助谁在下面得到这个exception通过logstash抽取数据错误:logstash.inputs.jdbc – 执行JDBC查询时的exception{:exception =>#}
答:JDBC的:mysql://本地主机:3306 /数据库名称zeroDateTimeBehavior = convertToNull”
或者如果你正在使用MySQL