如何在MySQL中取消严格的SQL模式

24

这是对于这个问题的追踪 MYSQL incorrect DATETIME format

如何一劳永逸地摆脱 STRICT_TRANS_TABLES?

mysql --help 报告以下配置:

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

$ ls  /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
ls: /Users/pain/.my.cnf: No such file or directory
ls: /etc/mysql/my.cnf: No such file or directory
ls: /usr/local/etc/my.cnf: No such file or directory
/etc/my.cnf

$ cat /etc/my.cnf
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION

但这样并没有帮助。我有一些遗留代码,每次重新启动计算机时都需要启动mysql并更改sql_mode。

更新

所以我放弃了Homebrew安装的MySQL,并从mysql.com下载了它。但那也没有帮助。根据这里的答案:如何修复“未知变量'sql-mode = ANSI'”?我尝试了不同变体的/etc/my.cnf[mysql][mysqld]sql_modesql-mode - 什么也没用。

7个回答

42

这个问题让我困扰了一段时间。到目前为止,所有的答案都没有解决原始问题,但我相信我的答案可以解决,所以我会发帖以帮助其他人。

我在 OS X 10.10.3 上安装了 MySQL(来自 mysql.com)Community Edition 5.7.10。

最终,我创建了一个包含以下内容的 /etc/mysql/my.cnf 文件:

[mysqld]

sql_mode=NO_ENGINE_SUBSTITUTION

重启服务器后,SHOW VARIABLES LIKE 'sql_mode'; 命令返回如下结果:

+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| sql_mode      | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+
1 row in set (0.00 sec)

最后,没有严格模式!


4
我也遇到了同样的问题,我的电脑是Mac OS X El Capitan系统。只有在/ etc / mysql / my.cnf文件中设置了sql_mode,它才能生效。我不得不手动创建这个文件夹和文件。 - Chiko
这并没有帮助我。 - Lazarus Thurston
1
仅需创建/etc/my.cnf文件即可生效,OS X默认安装不使用my.cnf,MySQL会采用默认值。 - sadiq
这对我也起作用了。我将它设置为我的~/.my.cnf文件的符号链接,因为它无法读取该文件。真不敢相信这仍然是个问题。或者它尝试从_mysql用户的主文件夹中读取,因为它正在以该用户身份运行。 - ar34z
这有所帮助 - 在Mac 10.15.5上安装了MySQL 8.0.21。 - Tirath

14

最终,我移除了从mysql.com获得的MySQL服务器,通过Homebrew重新安装,并不得不进行编辑。

/usr/local/Cellar/mysql/5.6.xx/my.cnf

我希望能够注释掉该死的STRICT_TRANS_TABLES,但不知道在哪里注释。

然而这并不能解释为什么默认配置会覆盖/etc/my.cnf中的配置,但我已经花费了太多时间在此上了。顺便说一句,我仍然不确定该怎么处理mysql.com提供的发行版。


7
实际上应该是 set global sql_mode='' :-)。 - Thomas
2
警告:使用“set global”查询来设置sql_mode不会在MySQL服务器重新启动时保留。最好遵循上面的建议(https://dev59.com/dmMl5IYBdhLWcg3wBy_y#34426883)。 - Chris Bartley

9
在CentOS 6.5上,我需要编辑/usr/my.cnf,并设置(即使/etc/my.cnf存在且绑定已在那里成功设置)。
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION

该包的来源:

mysql-community-client.x86_64      5.6.16-1.el6            @mysql56-community

这是在一个全新安装的(WHM)CentOS 6.7上,使用MariaDB 5.5.49时出现的情况。覆盖/etc/my.cnf的配置文件是/usr/my.cnf,其中有一行sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES - William Isted
这对我解决了问题。另一个选择是更新已经准备被替换的遗留代码,以在表创建中包含默认值。 - Mike Morris - MBXSW
相同的问题也出现在 Debian 7 Wheezy 上。 - Vedmant

6

不是很准确:mysql --help | grep /my会列出以下文件清单:/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf。而我没有这些文件,因此我想知道创建其中一个的确切语法。 - firedev
你应该可以使用 strace -f -e trace=open mysql 2>&1 | grep -i cnf 去查看你实际使用的 cnf 文件位置。然后,你可以编辑它正在使用的那个文件(如果它已经包含 sql_mode 指令),或者在任何一个被搜寻的位置创建一个新的文件,在 [mysqld] 部分中包含 sql_mode 指令。请参考mysql configuration file sample获取完美记录的样例文件。 - ThatOneDude
谢谢提供链接。我使用的是Mac,没有strace。不过这是我的/etc/my.cnf文件内容:[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION,但它并没有起作用,SHOW VARIABLES返回的是sql_mode STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION - firedev
1
你好,Nick,你在Mac上使用Homebrew安装了这个吗?如果是的话,我建议你也检查一下Homebrew安装目录中是否有my.cnf文件。它可能类似于/usr/local/Cellar/mysql/5.X.XX/my.cnf - ThatOneDude

4

现在您不能将sql_mode设置为空字符串,实际查询如下:

SET @@GLOBAL.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

MySQL 5.7.16


3

我尝试了所有有关MySQL 5.7在Mac OS 10.12上的严格模式关闭的解决方案,最终成功地关闭了严格模式,但不是因为my.cnf的位置,它可以位于MySQL检查的任何位置,而是由于UNIX权限问题。

我最初使用MySQL Workbench 6.2.3.12313创建了my.cnf文件。这可能引起两个问题:首先,它将选项设置为“sql-mode”而不是“sql_mode”,其次,它仅对root可读可写(位于/etc下)。当您像我一样从MySQL网站上的二进制程序安装时,MySQL不会以root身份运行,而是以_mysql身份运行。因此,_mysql用户需要能够读取/etc/my.cnf或您放置它的任何位置。为了使其工作,您需要运行:

sudo chmod o+r /etc/my.cnf

为了更好的效果,你可能还需要运行以下命令:

sudo chmod g+r /etc/my.cnf

接着,确保重新启动MySQL。(我发现在Mac OS的系统偏好设置MySQL面板上操作效果最佳;使用命令行有点混乱,而MySQL Workbench则不能正常工作。)只要在my.cnf中有一个不包含strict mode的sql_mode设置,严格模式应该已经关闭了。


这在我的Mac OS Mojave上可行。即使使用Maria DB也是如此。 - Tiger developer

0
在Mac OS X El Capitan上,我在用户主目录中创建了一个名为.my.cnf的文件,并在[mysqld]下设置了mysql的设置,然后重新启动了mysql。一切正常!

那对我没用。你是如何配置它在你的主目录中查找.my.cnf文件的? - Kudit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接