MySQL关于Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

在使用MySql 时, 数据库中的字段类型是timestamp的,默认为0000-00-00, 会发生异常:java.sql.SQLException:   Value   '0000-00-00 '   can   not   be   represented   as   java.sql.Timestamp

 “0000-00-00 00:00:00”在mysql中是作为一个特殊值存在的

但 java.sql.Date 将其视为 不合法的值 格式不正确因此产生异常


异常解决办法:

给jdbc   url加上   zeroDateTimeBehavior参数: 

datasource.url=jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true


zeroDateTimeBehavior=round是为了指定MySql中的DateTime字段默认值查询时的处理方式;默认是抛出异常,

对于值为0000-00-00   00:00:00(默认值)的纪录,如下两种配置,会返回不同的结果: 

zeroDateTimeBehavior=round      0001-01-01   00:00:00.0 

zeroDateTimeBehavior=convertToNull      null 


接收方式:

如果类型被定义为java.sql.Timestamp 这种类型的话 ResultSet  接收类型必须是Timestamp 这种类型不能使用java.sql.Date 类型。

接收到这种类型之后可以进行类型的转化 new   Date(timestamp.getTime());





MySQL关于Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

  (2011-05-25 11:38:40)
标签: 

数据库

 

测试数据

 

字段

 

it

分类: Java

处理Sql查询遇到这样一个问题(数据库是MySQL),有个字段定义类型是datetime,且非空无默认值,

通过PHPMyAdmin界面填充测试数据的时候没有理会这个字段,看到个小警告,插入成功,

但是在取数据的时候出现这样一个错误:

Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

 

因为数据库访问层是自己封装的架构,所以第一个想法是:“哇,遇到一个新情况”,

于是去看基类的反射处理部分,好像没啥问题,小小的失望了一下,

后来把整个错误扔到网上搜索了一下,嗬,还真不少,中文的英文的××文的都有,

捡个权威的吧(MySQL官方http://dev.mysql.com/doc/refman/5.1/en/connector-j-installing-upgrading.html):

Datetimes with all-zero components (0000-00-00 ...) — These values can not be represented reliably in Java. Connector/J 3.0.x always converted them to NULL when being read from a ResultSet.

Connector/J 3.1 throws an exception by default when these values are encountered as this is the most correct behavior according to the JDBC and SQL standards. This behavior can be modified using the zeroDateTimeBehavior configuration property. The allowable values are:

exception (the default), which throws an SQLException with an SQLState of S1009.

convertToNull, which returns NULL instead of the date.

round, which rounds the date to the nearest closest value which is 0001-01-01.

Starting with Connector/J 3.1.7, ResultSet.getString() can be decoupled from this behavior via noDatetimeStringSync=true (the default value is false) so that you can retrieve the unaltered all-zero value as a String. It should be noted that this also precludes using any time zone conversions, therefore the driver will not allow you to enable noDatetimeStringSync and useTimezone at the same time.

 

两种解决办法(高亮颜色我加的),两种方法都是在数据库连接串处追加设置,

现举例说下两种情况的结果:

原连接串:driver-url=jdbc:mysql://127.0.0.1/test

使用参数zeroDateTimeBehavior:

取值exception

driver-url=jdbc:mysql://127.0.0.1/test?zeroDateTimeBehavior=exception

结果:

java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

 

取值convertToNull:

driver-url=jdbc:mysql://127.0.0.1/test?zeroDateTimeBehavior=convertToNull

结果:

ClientDto[id:1,email:test@hotmail.com,civilite: 测试用户,prenom:贾,nom:某某,birthday:1992-03-18,telephone:12312345678,address:测 试用户的住址,regionid:1,postcode:111000,city:大 连,country:france,batiment:110#,escalier:2,code:151515,interphone:050505,etage: 东侧走廊,appartment:205,createdate:2010-03-16 09:30:21.0,status:0,totalprice:0.00,totalnum:0,lastdate:null,lasttotal:0.00,]

 

取值round:

driver-url=jdbc:mysql://127.0.0.1/test?zeroDateTimeBehavior=round

结果:

ClientDto[id:1,email:test@hotmail.com,civilite: 测试用户,prenom:贾,nom:某某,birthday:1992-03-18,telephone:12312345678,address:测 试用户的住址,regionid:1,postcode:111000,city:大 连,country:france,batiment:110#,escalier:2,code:151515,interphone:050505,etage: 东侧走廊,appartment:205,createdate:2010-03-16 09:30:21.0,status:0,totalprice:0.00,totalnum:0,lastdate:0001-01-01 00:00:00.0,lasttotal:0.00,]

 

另一参数noDatetimeStringSync:

driver-url=jdbc:mysql://127.0.0.1/test?noDatetimeStringSync=true

结果:

ClientDto[id:1,email:test@hotmail.com,civilite: 测试用户,prenom:贾,nom:某某,birthday:1992-03-18,telephone:12312345678,address:测 试用户的住址,regionid:1,postcode:111000,city:大 连,country:france,batiment:110#,escalier:2,code:151515,interphone:050505,etage: 东侧走廊,appartment:205,createdate:2010-03-16 09:30:21,status:0,totalprice:0.00,totalnum:0,lastdate:0000-00-00 00:00:00,lasttotal:0.00,]

 

个人感觉按通用性来说结果是Null可能好些,但是结果是一串零的更能贴近空时间的概念,所以具体选择看各自项目的需求选择使用吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值