遇到“1067 – Invalid default value for ‘field’”错误的处理办法?!

起因是在这次对网站进行搬家时数据库由原来的 MariaDB (版本:10.4.34-MariaDB)更换成 Mysql (版本:8.4.2)了。
于是在迁移 WordPress 的数据库时报错,通过查找发现是卡在了一个时间类型的字段上面。

报错信息:1067 - Invalid default value for 'comment_date'

查看SQL语句可以看到这个字段的默认值是 0000-00-00 00:00:00 ,刚开始我想到的手段是将这些默认值都修改成 NOW() 或者 CURRENT_TIMESTAMP() 这样的。工作量不大批量替换一下即可,但是最后想了想这样改动了原数据库的表结构不知道会有什么影响,甚至还会影响到下次迁移时的表结构就放弃这个操作了。

后来发现除了可以 SQL 语句的默认值外还能修改 sql_mode 来解决,但是理论上来说既然默认在数据库中进行了这个限制肯定有他的道理的,如果不是这样我也不想修改的所以我决定进行临时修改

1、查看当前的

show variables like 'sql_mode';

2、当前会话生效

SET SESSION sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

3、重启前生效

SET global sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

最后因为换了一个迁移步骤只能执行全局修改了,除非重启了数据库否则都能生效。

数据库迁移成功了,但是因为其他问题导致出现404错误而再次重装操作系统就是另外的问题了。(所以我也没有机会测试到若是数据库重启了恢复了原有的 sql_mode 这会不会报错)

ChiuYut

2024年10月07日

发布者

ChiuYut

咦?我是谁?这是什么地方? Ya ha!我是ChiuYut!这里是我的小破站!