如何撤销MySQL中的ALLOW_INVALID DATES设置?解决插入数据时的1265数据截断错误及BDAY列显示0000-00-00问题
解决MySQL SQL模式还原与1265数据截断错误问题
Hey,完全不用重新安装MySQL!咱们一步步来搞定你的问题:
一、把SQL模式还原到正常状态
你之前执行的SET SQL_mode= 'ALLOW_INVALID DATES'要么只影响当前会话,要么全局设置但重启MySQL后会失效,还原起来很简单:
先查看当前SQL模式
先执行这条命令确认现在的设置:SELECT @@sql_mode;临时还原(重启MySQL后失效)
如果只是临时修改了会话级别的设置,直接重启MySQL服务就能回到配置文件里的默认值。要是想手动改回默认,MySQL 5.7及以上版本的默认SQL模式是:SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';注意:
GLOBAL是修改全局设置,新会话会生效;如果只想改当前会话,把GLOBAL换成SESSION就行。永久还原(重启后依然生效)
找到MySQL的配置文件:- Linux系统一般是
/etc/my.cnf或/etc/mysql/my.cnf - Windows系统一般是
my.ini(可能在MySQL安装目录或C盘ProgramData文件夹里)
打开文件找到sql_mode配置项,改成默认值(或者你之前的正常设置),保存后重启MySQL服务就搞定了。
- Linux系统一般是
二、解决1265数据截断错误(BDAY列显示0000-00-00)
你设置了ALLOW_INVALID DATES还是报错,核心问题不是SQL模式,而是插入的数据不符合BDAY列的要求:
先确认BDAY列的类型和约束
执行这条命令查看列的详细信息:DESCRIBE your_table_name; -- 把your_table_name替换成你的实际表名确认它是
DATE、DATETIME还是其他日期类型,以及是否允许NULL值。检查插入的数据格式
- 如果BDAY是
DATE类型,必须是YYYY-MM-DD的标准格式(比如2020-05-15),要是你插的是05/15/2020或者其他非标准格式,就会被截断成0000-00-00 - 要是你插的是无效日期(比如
2023-02-30),哪怕ALLOW_INVALID DATES允许,某些场景下还是会触发截断,这时候得先确认数据本身是否合法
- 如果BDAY是
处理空日期的场景
如果业务允许空生日,建议把BDAY列设置为允许NULL,插入NULL而非0000-00-00,这更符合数据库设计规范。如果必须保留0000-00-00,那需要调整SQL模式,去掉NO_ZERO_DATE和NO_ZERO_IN_DATE这两个选项,但前提是数据格式得是标准的YYYY-MM-DD。
三、关于重装MySQL
**完全没必要!**这些都是配置和数据格式的问题,调整好配置、修正插入的数据就能解决,重装纯粹是浪费时间。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

