具体原因:
(1)在mysql5.0.2以前,mysql对非法值检查并不严厉,而且为了数据输入还会强制将他们变为合法值。
(2)在5.0.2以后的版本中,保留了以前的默认行为,但你可以为不良值选择更传统的处理方法,从而使得服务器能够拒绝并放弃出现不良值的语句。
解决方法:
(1)项目使用django+mysql;
(2)在linux中使用的是mysql5.7,导入数据提示:Field * doesn't have a default value;
(3)想要解决问题就需要知道在mysql5.7中,启用了严格模式:
在配置文件中 /etc/mysql/my.cnf 中找到:
sqlmodel=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION修改为:sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;
(4)重启mysql,在重新同步模型到数据库。
mysql 默认行为和新的严格sql模式和区别:
如果未使用严格模式,下面的情况是合法的。如果将不正确的值插入到列,如将null值插入非null列,或将过大的数据插入数值列,mysql 会将这些列设置为最可能的值,而不是抛出错误信息。
如果视图将超过范围的值保存到数值列,mysql服务器将保存0(最小的可能值)取而代之,或最大的可能值。
对于字符串,mysql 或保存空字符串,或将字符串可能多的部分保存到列中。
如果打算将不是以数值开头的字符串保存到数值列,mysql将保存0。
mysql允许将特定的不正确日期值保存到DATE和DATETIME列(如:“2000-02-31” 或 “2000-02-00”)。其观点在于,验证日期不是sql服务器你的值。如果mysql能保存日期值并且准确检索相同的值,mysql就能按给定的值保存它。如果日期错误(超出服务器能保存的范围)将在列中保存特殊的日期值“0000-00-00”取而代之。
如果视图将null值保存到不接受null值的列,对于单行insert语句,将出现错误。对于多行insert语句或者insert into...select语句,mysql服务器会保存针对列数据类型的隐含默认值。一般情况下,对于数值类型,它是0,对于字符串类型,它是空字符串(‘’),对于日期和时间类型是“zero”。
如果insert语句未为列指定值,如果列定义包含明确的default子句,mysql将插入默认值。如果在定义中没有这类default子句,mysql 会插入列数据类型的隐含默认值。
采用前描述规则的原因在于,在语句开始执行前,无法检查这些情况。如果在更新了舒航后遇到这类问题,我们不能仅靠回滚解决,这是因为存储引擎可能不支持回滚。种植语句并不是良好的选择,在该情况下,更新完成了“一半”,这或许是最差的情况。对于本例,较好的方式是“尽可能做到最好”,就像什么都没有发生那样继续执行。