如何摆脱 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_mode
、sql-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 模式的主要内容,如果未能解决你的问题,请参考以下文章