错误产生场景:
在对 MySQL 数据表进行数据插入操作时,出现错误:1364 Field ‘xxx’ doesn’t have a default value (其中’xxx’代表某字段名)。而隔壁老王使用和我一样的表结构及插入语句,却成功执行了!?
错误产生原因:
根据错误提示可以得知,即某某字段(’xxx’)需要一个默认值。在 MySQL 5.0 以上版本,strict mode (STRICT_TRANS_TABLES) 模式下有如下限制:
1. 不支持对 not NULL 字段插入 NULL 值;
2. 不支持 text 字段有默认值;
3. 不支持对自增长字段插入 ” 值,可插入 NULL 值。
错误解决方法:
根据以上错误产生的原因分析,我们可以得出解决问题的第一个方法,即根据 strict mode 的限制对数据表结构一一进行改进:
1. 给所有 not NULL 字段都设置非 NULL 默认值,如字符串默认值为 ”,数值默认值为 0,日期默认值为 ‘0000-00-00 00:00:00’;
2. 去掉 text 字段的默认值;
3. 主键无法设置默认值,那么务必将其设置为自增长(AUTO_INCREMENT)字段。
好了,问题解决了,可为什么同样的表结构和语句,有人能执行成功,有人却会出现这个提示呢?
这就引出了解决问题的第二个方法,直接关闭 MySQL 的 strict mode 模式:
1. 找到 MySQL 目录下的配置文件 my.cnf(WIN 系统下为 my.ini);
2. 打开文件,将 sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION” 中的 STRICT_TRANS_TABLES 删除后保存;
3. 重启 MySQL 服务。
使用 MySQL 的严格模式可以使数据更加安全严格,缺点是减少了对空数据入库的兼容性。具体如何取舍,还是根据自己的项目情况考虑吧~