手机扫一扫访问本页内容

微信扫描点右上角"···"分享到好友或朋友圈

关闭
微信扫一扫可打开小程序

微信长按图片或搜“分享录”可打开小程序

关闭
MySQL,经验 , , ,

MySQL报“Incorrect datetime value: ‘0000-00-00 00:00:00’ for column xxx at row 1”错误

今晚正准备给网站加SEO,没想到在新增字段的时候竟然报错了:

我感到很莫名其妙,我明明是新增keywords为什么报日期默认格式不对,于是查下资料网上说是数据库模式设置不对。

关于MySQL数据库的模式官网这样解释:

官网解释数据库模式

MySQL服务器可以在不同的SQL模式下运行,并且可以根据SQL_mode系统变量的值,为不同的客户机应用不同的模式。DBA可以将全局SQL模式设置为与站点服务器操作要求匹配,每个应用程序都可以将其会话SQL模式设置为自己的要求。

模式会影响MySQL支持的SQL语法,并且会执行数据验证检查。这使得在不同的环境中使用MySQL以及与其他数据库服务器一起使用MySQL变得更加容易。

官网还说MySQL 5.7.8开始新增 ERROR_FOR_DIVISION_BY_ZERONO_ZERO_DATE, and NO_ZERO_IN_DATE这几种作为默认模式。

其中,NO_ZERO_DATE、NO_ZERO_DATE模式解释如下:

NO_ZERO_DATE:在严格模式,不要将 ‘0000-00-00’做为合法日期。你仍然可以用 IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。

NO_ZERO_IN_DATE:在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。

于是查一下我的数据库版本和默认模式:

明显高于5.7.8版本、默认模式包含NO_ZERO_DATE、NO_ZERO_IN_DATE,所以操作数据库的时候会执行相关校验,这就是为什么我新增varchar字段却报日期字段默认值无效的原因。为了能添加这两个字段我先把这两种模式去掉:

我勒个去NO_ZERO_DATE、NO_ZERO_IN_DATE两种模式后还是不行,本能的想到很多问题可以通过重启重装来解决,重启后执行:

神奇了,竟然可以了,其实清缓存重新连接数据库就可以了。

另外,连接数据库转化为对象出错的解决办法为在数据库连接后面加上参数zeroDateTimeBehavior=convertToNull 这样如果碰到 ‘0000-00-00:00:00:00’的日期类型时,将会转化为null值:

db.jdbcurl=jdbc:mysql://192.168.1.4:3306/db?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

数据连接的参数会影响着服务器到数据库数据的行为,更多的参数说明可以查看官网说明文档

另外这篇文章有讲解更新到5.7以后会遇到的一些问题和解决方案:

http://blog.itpub.net/28218939/viewspace-2220515/


历史上的今天:

展开阅读全文


上一篇:

下一篇:

您还可以访问本站的小程序、公众号等所有端,或者下载APP, 在小程序、APP上可以评论文章以及保存图片还有在线客服哦,如您有任何疑问或建议可向作者提出意见反馈
关注我的公众号每天为您分享各类有用信息
扫码打开小程序可评论文章保存图片,在“我的”有实时在线客服哦,看效果?
分享录多端跨平台系统
分享录交流群