如何摆脱 MySQL 中的 STRICT SQL 模式

Posted

技术标签:

【中文标题】如何摆脱 MySQL 中的 STRICT SQL 模式【英文标题】:How to get rid of STRICT SQL mode in MySQL 【发布时间】:2013-09-16 17:22:59 【问题描述】:

这是对这个问题的跟进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 下载了它。但这也无济于事。按照这里的答案:How to fix `unknown variable 'sql-mode=ANSI'`? 我尝试了/etc/my.cnf 的不同变体:[mysql][mysqld]sql_modesql-mode - 没有任何帮助。

【问题讨论】:

【参考方案1】:

这个问题也困扰了我一段时间。到目前为止,没有一个答案解决了最初的问题,但我相信我的答案是这样,所以我会发布它以防它帮助其他人。

我在 OS X 10.10.3 上安装了 MySQL(来自 mysql.com)社区版 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)

终于没有严格模式了!

【讨论】:

我的 Mac OS X 和 El Capitan 也发生了同样的事情。 sql_mode 仅在 /etc/mysql/my.cnf 中设置时有效。我也必须创建文件夹和文件。 这对我没有帮助, 只需创建 /etc/my.cnf 文件即可。默认情况下,OS X 安装不使用 my.cnf,MySQL 只使用默认值。 这对我也有用。我将它作为我的~/.my.cnf 文件的符号链接,它不会读取。不敢相信这仍然是一个问题。或者它可能会尝试从_mysql 用户的主文件夹中读取,因为它以该用户身份运行? 这有帮助 - Mac 10.15.5 上的 mysql 8.0.21。【参考方案2】:

所以最后我删除了我从 mysql.com 获得的 MySQL 服务器,通过 Homebrew 重新安装并不得不编辑

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

我可以在哪里评论该死的STRICT_TRANS_TABLES

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

【讨论】:

实际上应该是set global sql_mode='' :-) 警告:使用set global 查询设置 sql_mode 不会在 MySQL 服务器重新启动后持续存在。你最好听从above的建议。【参考方案3】:

在 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这为我解决了。另一种方法是更新已被替换的遗留代码,以在表创建中包含默认值。 同样的问题出现在 Debian 7 Wheeze 上【参考方案4】:

根据MySQL Strict Mode on OS X,有问题的设置实际上是/usr/local/mysql/my.cnf,可以注释掉以阻止这种行为。

【讨论】:

不完全是:mysql --help | grep /my 给出了以下列表:/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 我没有这些文件,所以我想知道创建一个的确切语法。 您应该可以使用strace -f -e trace=open mysql 2>&1 | grep -i cnf 来查看您实际使用的是哪个cnf 文件。之后,您可以编辑它正在使用的那个(如果它已经包含一个 sql_mode 指令)或在任何搜索到的包含sql_mode 指令的位置创建一个新的[mysqld] 部分。请参阅 mysql configuration file sample 以获取详细记录的示例文件。 感谢您的链接。我在 Mac 上,没有 strace。但是这是我的/etc/my.cnf:[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION,它不起作用,SHOW VARIABLES 返回sql_mode STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION 你好尼克,你是用自制软件在你的 Mac 上安装它的吗?如果是这样,我会让你检查自制安装目录中的 my.cnf 文件。这可能类似于/usr/local/Cellar/mysql/5.X.XX/my.cnf【参考方案5】:

现在你不能将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

【讨论】:

【参考方案6】:

我在 Mac OS 10.12 上使用 MySQL 5.7 尝试了我能找到的所有答案,最终关闭了严格模式,这不是因为 my.cnf 的位置,它可能位于 MySQL 所说的任何地方检查,但由于 UNIX 权限问题。

我最初使用 MySQL Workbench 6.2.3.12313 创建 my.cnf。这导致了两个可能的问题:首先,它将选项设置为“sql-mode”而不是“sql_mode”,并且它使文件(位于 /etc 中)仅对 root 可读和可写。当您按照我的方式从 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 上的 System Preferences MySQL 面板最有效;使用命令行有点混乱,MySQL Workbench 的功能根本不起作用。)只要你在 my.cnf 中有一个 sql_mode 设置,不涉及严格模式,严格模式应该关闭。

【讨论】:

这适用于我在 Mac OS Mojave 上。即使是 Maria DB【参考方案7】:

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

【讨论】:

这对我不起作用。您是如何将其配置为在您的主目录中查找 .my.cnf 文件的?

以上是关于如何摆脱 MySQL 中的 STRICT SQL 模式的主要内容,如果未能解决你的问题,请参考以下文章

MySQL技巧--SQL MODE(Strict SQL Mode)

如何开启MYSQL的严格模式

mysql 严格模式 Strict Mode说明

mysql 严格模式 Strict Mode说明

如何摆脱 PL/SQL 程序中的编译错误?

如何摆脱 SQL Server 2000 中的扩展表属性?