mysql 默认时间错误_关于Mysql的时间类型以及带来的错误

关于Mysql的时间类型范围

网上说:

关于mysql时间类型datetime与timestamp范围

datetime类型取值范围:1000-01-01 00:00:00 到 9999-12-31 23:59:59

timestamp类型取值范围:1970-01-01 00:00:00 到 2037-12-31 23:59:59

timestamp类型具有自动初始化和自动更新的特性。

我使用mysql5.7

建表使用数据版本字段(时间戳)

`version` timestamp NOT NULL DEFAULT '1970-01-01 00:00:00' ON UPDATE CURRENT_TIMESTAMP,

会报错:

74e09a7e5ce7621cbb1697faffe34da4.png

必须使用更大的时间,后来改为下面的默认值来解决的。

`version` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

其实是有办法使mysql5.6允许时间默认值为'0000-00-00 00:00:00'

方法:

在mysql的初始化配置文件my.ini

[mysqld]下删除sql_mode=xxxxxx中的NO_ZERO_DATE再重启mysql服务。

例如:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

但是经过JDBC驱动包到hibernate以后,会报错:

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

mysql-connector-java-5.1.38-bin.jar高版本的JDBK驱动不能转化0时间到java对象中,所以最好的办法就是不用零时间做默认值。

Mysql5.0升级到Mysql5.6

1 要升级驱动包到5.1.XX,

2 升级方言类为(在配置sessionFactory中指定方言)

org.hibernate.dialect.MySQL5InnoDBDialect

3 关于老项目Mysql5.0升级到Mysql5.6遇到的异常:

原因分析:

2017年1月10日

进过3天的爬坑,终于解决了乐观锁  数据版本字段version造成的以上错误。

错误分析:

配置的版本字段,值是由hibernate生成并保存到数据库的,而数据库的表本身建表语句使用了:

`version` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,

数据库中表本身的时间戳版本字段(时间戳)的数据由数据库自己生成,这样就会出现每次修改数据,时间戳都被赋予了两次(其实只有第二次由数据库生成的时间戳才是真正被保存的),两者有了毫秒级的差距,实际上时间戳是数据库生成的,可是Hibernate以为自己持有的才是对的。在没有再次访问数据库获取时间戳就对数据进行修改操作时,Hibernate的时间戳和数据库的时间戳必定不同就造成了这个错误。

解决办法:

修改时间戳配置增加 generated="always"

表示时间戳数据由数据库提供(无论数据的创建和更新,时间戳都用数据库生成的当前时间)。

可是

`version` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,

又会报另外一个错误,0000-00-00 00:00:00不能被解释成sql.Date。

这样必须要给timestamp 设置一个1970-01-01 00:00:01 ~ 2038 范围之内的初始值。

问题又来了:设置1970-01-01 00:00:01 数据库会报错1067 Invalid default value for 'version'

也就是数据库不允许设置这个时间戳。

所以改成了初始化时间戳为DEFAULT CURRENT_TIMESTAMP。 添加并修改数据成功。

4Java连接Mysql数据库警告(升级mysql驱动包出现的警告):

Establishing SSL Connection Without Server’s Identity Verification Is Not Recommend

解决办法:数据库url后面加上 ?useSSL=true

5 日志打印Hibernate的sql参数和返回

为解决本问题使用了Hibernate在Log4J中打印sql参数的功能:

前提是开启了Hibernate中的:

true

true

在log4j的配置文件中添加下面内容

#hibernate

log4j.logger.org.hibernate.type=TRACE

log4j.logger.org.hibernate.sql=TRACE

如果您受到这篇文章的帮助 请留言鼓励。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值