关于Mysql的时间类型以及带来的错误

2017-01-12 09:51:31来源:oschina作者:颖辉小居人点击


关于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,

会报错:



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


`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遇到的异常:

https://www.oschina.net/question/2507499_2216974


原因分析:


2017年1月10日


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


错误分析:



"version"column="version">



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



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



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


解决办法:


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



"version"column="version"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

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

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台