有一个sql错误2018-9-31进入数据库的数据库不太确定为什么我只在那个日期得到所有0' s。任何帮助都非常感激,它发生在每个第3季度插入。
INSERT INTO leagues(start,Name,type,end,cashstock) VALUES( '2018-4-1', 'Quarter 2 2018', 'public', '2018-6-30', '7500' )
INSERT INTO leagues(start,Name,type,end,cashstock) VALUES( '2018-7-1', 'Quarter 3 2018', 'public', '2018-9-31', '7500' )
返回
Edit Edit
Copy Copy
Delete Delete
2018-04-01
Quarter 2 2018
3
public
2018-06-30
7500
Edit Edit
Copy Copy
Delete Delete
2018-07-01
Quarter 3 2018
4
public
0000-00-00
7500
答案 0 :(得分:2)
9月只有30天。因此2018-9-31
是无效日期,因此会插入默认0000-00-00
。
我建议不要遗漏这个并且要么在你的应用程序中检查有效日期,要么让MySQL通过enabling strict mode处理它:
如果启用了严格模式,则不允许使用'0000-00-00'并且插入会产生错误,除非同时给出了IGNORE。对于INSERT IGNORE和UPDATE IGNORE,允许使用'0000-00-00'并且插入会产生警告。
或者您也可以使用NO_ZERO_DATE
:
NO_ZERO_DATE模式会影响服务器是否允许'0000-00-00'作为有效日期。它的效果还取决于是否启用了严格的SQL模式。
答案 1 :(得分:0)
你还没有说过你正在使用MySQL,但我打赌如此:这是一个MySQL Gotcha。除非你告诉MySQL严格,并做了相当多的设置,否则即使不应该,MySQL也会默默地“工作”。你遇到过这样的情况。
在这种情况下,9月只有30天,所以9月31日是不正确的日期。 MySQL已将无效数据输入您的数据库,而不是失败。为了防止这种情况发生,或者更快地看到错误,建议使用InnoDB(不 MyISAM)和enabling strict mode。
如果你是从命令行运行它,界面会显示一个警告计数,之后你会执行'显示警告'来查看它们。
此外,来自the documentation:
MySQL允许为指定为字符串的值使用“宽松”格式,其中任何标点字符都可以用作日期部分或时间部分之间的分隔符。在某些情况下,这种语法可能是欺骗性的。例如,“10:11:12”之类的值可能看起来像时间值,因为:,但如果在日期上下文中使用,则会被解释为年份“2010-11-12”。值'10:45:15'被转换为'0000-00-00',因为'45'不是有效月份。