本来以为是mysql版本的问题,上午搜索的时候也是这个错误,搜索了一下有的人说是mysql版本问题。于是上午尝试将mysql 从5.7升级到8.0,不出意外,又失败了,数据库丢失,并且mysql安装失败了。
下午晚上尝试优化数据库的时候又出现了这个错误:
又搜索了一下发现是mysql设置问题,下面是抄的百度ai的,不得不说,这段答复质量还是可以的:
在MySQL中,如果你尝试将一个日期时间字段(DATETIME)的默认值设置为’0000-00-00 00:00:00’,你可能会遇到一个错误,因为MySQL不允许使用’0000-00-00 00:00:00’作为有效的日期时间值。
解决方案:
修改MySQL配置文件:
你可以在MySQL的配置文件(通常是my.cnf或者my.ini)中设置sql_mode,将其设置为允许’0000-00-00 00:00:00’。
[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION
然后重启MySQL服务。
使用NOW()或CURRENT_TIMESTAMP作为默认值:
如果你不需要’0000-00-00 00:00:00’作为默认值,你可以使用NOW()或CURRENT_TIMESTAMP作为默认值,这样在插入新行时,如果没有为DATETIME字段指定值,它将自动使用当前的日期时间。
CREATE TABLE example ( id INT PRIMARY KEY, created_at DATETIME DEFAULT NOW() );
使用ON INSERT触发器:
如果你需要’0000-00-00 00:00:00’作为默认值,但MySQL不允许,你可以使用INSERT触发器来在插入新行时设置默认值。
CREATE TABLE example ( id INT PRIMARY KEY, created_at DATETIME DEFAULT '0000-00-00 00:00:00' ); CREATE TRIGGER before_insert_example BEFORE INSERT ON example FOR EACH ROW BEGIN IF NEW.created_at = '0000-00-00 00:00:00' THEN SET NEW.created_at = NOW(); END IF; END;
请注意,在任何情况下,你都需要确保你的应用程序或数据库操作能够处理’0000-00-00 00:00:00’作为有效的日期时间值,因为它在MySQL中是一个特殊的标记。如果你的应用程序或者框架不支持这个值,你可能需要进行一些额外的处理。
只需要修改[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION 配置,重启服务就可以了。😔白折腾半天,不过好处是用上么mysql8了。
20 comments
新版本要求更严格,跟PHP一样,很多在就版本没问题的函数,在新版本直接warning
这个默认值旧版本也会报错,所以才升级的。现在看来不是版本问题。
所以我用 int 不用 datetime
机智如你,🥰
顺便把字符集的问题也解决啦 之前有的emoji存储🈶问题
emoji 我在 windows 和安卓手机上看有很多口。不管了。
突然想起来我本地的MySQL已经寄了几个月了,一直忘了修
赶紧修 看来还是服务多 不差这一个
没有没有,服务器里的是正常的,我说的是我自己的电脑上的,那确实不常用
酱紫,那不常用就无所谓啦。等需要的时候再修复
php7下大部分东东在8下得需要修改,要不各种报错。机箱不错。😎
是的 所以没上8
mysql 还用5呢 部分程序的php 倒是已经升级到8了
现在很多人都把MYsql升到了8.0,我还是没有勇气升,感觉能用就行,不求最新。
嗯嗯,能跑就尽量不要折腾,太容易出问题了。
用画笔工具把肉丝上的字母去掉好看多了
我想8.2升级8.4,结果数据库直接崩溃了~
哈哈哈。千万别折腾了,哎,都这么劝别人,到了自己这里依然是继续折腾啊。
收藏了先 暂时没遇到这个问题 我默认值也一直是0000
嗯嗯 这个在mariadb10上貌似就没问题