【问题标题】:How do I disable STRICT_TRANS_TABLES for a Homebrew-installed MySQL server?如何为 Homebrew 安装的 MySQL 服务器禁用 STRICT_TRANS_TABLES?
【发布时间】:2014-01-01 20:04:45
【问题描述】:

似乎 MySQL 最近(5.6?)将默认 SQL 模式更改为更具限制性。新模式是“STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION”。我喜欢这种变化,但至少有一个我维护的网站不喜欢。 INSERT 查询失败,因为它们没有为没有默认值的列指定值。以前,MySQL 会根据列类型推断默认值。

现在,我想禁用 STRICT_TRANS_TABLES。我已将sql_mode=NO_ENGINE_SUBSTITUTION 添加到my.cnf 并重新启动服务器,但严格设置仍然存在。我做错了什么?

MySQL 版本:

$ mysqld --version
mysqld  Ver 5.6.15 for osx10.9 on x86_64 (Homebrew)

我的.cnf:

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

# not sure if this is needed but it doesn't seem to have an effect either way
[mysqld_safe]
sql_mode=NO_ENGINE_SUBSTITUTION

确认 mysqld 将使用 my.cnf 中的设置:

$ mysqld --print-defaults
mysqld would have been started with the following arguments:
--sql_mode=NO_ENGINE_SUBSTITUTION

确认mysqld当前没有运行:

$ ps aux | grep mysql
metaphile        1022   0.0  0.0  2432784    600 s003  S+    3:10PM   0:00.00 grep mysql

Homebrew 提供的属性列表:

$ cat ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>homebrew.mxcl.mysql</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/mysql/bin/mysqld_safe</string>
    <string>--bind-address=127.0.0.1</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/usr/local/var</string>
</dict>
</plist>

启动 MySQL 并检查 SQL 模式:

$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
$ mysql -uroot
...
mysql> SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode;
+--------------------------------------------+--------------------------------------------+
| @@GLOBAL.sql_mode                          | @@SESSION.sql_mode                         |
+--------------------------------------------+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+--------------------------------------------+
1 row in set (0.00 sec)

啊!

【问题讨论】:

    标签: mysql macos homebrew


    【解决方案1】:

    在 Centos 6.5 上,我必须编辑 /usr/my.cnf 并设置(即使 /etc/my.cnf 存在并且绑定已成功设置在那里

    [mysqld]
    sql_mode=NO_ENGINE_SUBSTITUTION
    

    【讨论】:

    • 这实际上是正确的答案。事实证明,如果你在 CentOS 上升级到 MySQL 5.6,它会安装一个 /usr/my.cnf 文件,无论 /etc/my.cnf 文件如何,它都会被读取。
    • 太好了,/usr/my.cnf 覆盖 /etc/my.cfn 设置 STRICT_TRANS_TABLES
    • 对我很有帮助。谢谢!
    【解决方案2】:

    @ssnobody 的回答提示我在整个系统中搜索 my.cnf 文件。我已经检查了mysqld --help --verbose 列出的位置。事实证明,我的服务器正在使用/usr/local/Cellar/mysql/5.6.15/my.cnf,我错误地认为它是一个示例文件。该文件未从任何标准位置进行符号链接,包括 /usr/local/mysql

    任何人都可以对此有所了解吗?这是自制的东西吗?除了对我能找到的每个 my.cnf 进行测试修改外,我怎么能弄清楚这一点?

    【讨论】:

    • 我相信 brew link 应该将该文件链接到 /usr/local/mysql。 strace -f -e trace=open mysql 2&gt;&amp;1 | grep -i cnf 也可以查看 mysql 使用的是哪个 cnf 文件。
    • 如果您使用的是 brew,只需键入 brew list mysql。它将列出 mysql 配置文件的所有选项
    【解决方案3】:

    要禁用特定脚本的 STRICT_TRANS_TABLES,

    set session sql_mode = '';
    

    当您在脚本中初始化数据库句柄时。这也会禁用 NO_ENGINE_SUBSTITUTION,所以只需

    set session sql_mode = 'NO_ENGINE_SUBSTITUTION';
    

    将保持原样。

    【讨论】:

      【解决方案4】:

      请检查/usr/local/mysql/my.cnf并注释掉有问题的设置。

      来源:MySQL Strict Mode on OS X

      【讨论】:

      • 这不是完全解决我的问题的方法,但确实有帮助。谢谢。
      【解决方案5】:

      你需要编辑:

      /usr/my.cnf 
      

      并设置

      sql_mode=NO_ENGINE_SUBSTITUTION
      

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        • 2013-06-07
        • 1970-01-01
        • 2018-01-08
        • 2014-07-16
        • 2016-09-01
        相关资源
        最近更新 更多