我已将我们的服务器升级到包含 Mysql 5.7 的 Ubuntu 16,并且默认情况下启用严格模式(尽管在任何配置文件中都没有它的条目)。
我们在导入 mysql 5.6 及更早版本下生产中的数据库时遇到了问题,这是因为严格模式。默认情况下,启用了以下内容:
STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
如何配置 mysql 5.7 使其与 5.6 完全一样工作,或者使得 5.6 中的数据库与 5.7 兼容?
答案1
要禁用严格的 SQL 模式,请通过 SSH 登录到您的服务器root
并创建此文件:
/etc/mysql/conf.d/disable_strict_mode.cnf
打开文件并输入以下两行:
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
使用以下命令重新启动 MySQL:
sudo service mysql restart
此更改禁用了 MySQL 5.7 中添加的两个 SQL 模式设置STRICT_TRANS_TABLES
和ONLY_FULL_GROUP_BY
,这两个设置会给一些较旧的应用程序带来问题。
确认严格 SQL 模式已禁用
您可以通过运行以下命令来确认严格 SQL 模式是否已禁用root
:
sudo mysql -i -BN -e 'SELECT @@sql_mode' | grep -E 'ONLY_FULL_GROUP_BY|STRICT_TRANS_TABLES'
如果禁用严格模式,您将看不到该命令的任何输出。
如果禁用严格模式给您带来任何问题,您可以通过删除该文件并重新启动 MySQL 来再次启用它。
答案2
设置sql_mode
在/etc/mysql/mysql.conf.d/mysqld.cnf
无STRICT_TRANS_TABLES
。
添加于[mysqld]
:
sql_mode = NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION