MySQL重启后sql_mode重置,如何永久禁用NO_ZERO_IN_DATE和NO_ZERO_DATE?
解决MySQL重启后sql_mode参数恢复的问题
这个问题我碰到过好多次啦!你用SET命令修改的sql_mode只是临时生效的——MySQL重启后会重新加载配置文件里的默认值,所以那些你禁用的参数自然又回来了。下面教你怎么永久修改:
步骤1:确认当前全局sql_mode
先登录MySQL,执行这条命令查看当前全局的参数配置,方便后续修改时参考:
SELECT @@GLOBAL.sql_mode;
步骤2:找到MySQL配置文件
不同系统的配置文件位置不一样:
- Linux/Unix系统:常见路径是
/etc/my.cnf、/etc/mysql/my.cnf,Ubuntu系统可能在/etc/mysql/mysql.conf.d/mysqld.cnf - Windows系统:配置文件一般叫
my.ini,大概率在MySQL安装目录,或者C:\ProgramData\MySQL\MySQL Server X.X(X.X为你的版本号,这个文件夹是隐藏的)
步骤3:修改配置文件
打开找到的配置文件,定位到[mysqld]段落(如果没有就手动添加这个段落),然后写入你需要的sql_mode参数,注意不要包含NO_ZERO_IN_DATE和NO_ZERO_DATE:
[mysqld] sql_mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
步骤4:重启MySQL服务
保存配置文件后,重启服务让修改生效:
- Linux系统:执行命令
sudo systemctl restart mysql(老版本用sudo service mysql restart) - Windows系统:按Win+R输入
services.msc打开服务管理器,找到MySQL服务右键重启;或者用命令提示符执行net stop MySQL,停服后再执行net start MySQL
步骤5:验证修改结果
重启后再次登录MySQL,执行以下命令确认参数已经永久生效:
SELECT @@GLOBAL.sql_mode;
此时输出里应该已经没有NO_ZERO_IN_DATE和NO_ZERO_DATE,而且下次重启服务器也不会再恢复啦!
补充说明:你之前用的
SET sql_mode=...只修改了当前会话的参数,就算用SET GLOBAL sql_mode=...也只是在服务器运行周期内有效,只有修改配置文件才能实现永久生效。
内容的提问来源于stack exchange,提问作者Omer




